gKit2 light
Classes | Functions
material_data.cpp File Reference
#include <cstdio>
#include <algorithm>
#include "image_io.h"
#include "texture.h"
#include "material_data.h"
#include "mesh_data.h"

Go to the source code of this file.

Classes

struct  TextureData
 

Functions

int read_textures (std::vector< MaterialData > &materials, const size_t max_size)
 charge les textures associees a un ensemble de matieres, sans depasser une limite de taille, 1Go par defaut. More...
 
void release_textures (std::vector< MaterialData > &materials)
 detruit les textures. More...
 

Class Documentation

◆ TextureData

struct TextureData

Definition at line 12 of file material_data.cpp.

Class Members
ImageData diffuse_image
bool use_diffuse
ImageData ns_image
bool use_ns

Function Documentation

◆ read_textures()

int read_textures ( std::vector< MaterialData > &  materials,
const size_t  max_size 
)

charge les textures associees a un ensemble de matieres, sans depasser une limite de taille, 1Go par defaut.

Definition at line 92 of file material_data.cpp.

93 {
94  std::vector<TextureData> textures;
95 
96  // evalue la taille totale occuppee par toutes les images / textures
97  size_t total_size= 0;
98  for(int i= 0; i < (int) materials.size(); i++)
99  {
100  const MaterialData &material= materials[i];
101  TextureData data;
102 
103  if(!material.diffuse_filename.empty())
104  {
105  data.use_diffuse= true;
106  data.diffuse_image= read_image_data(material.diffuse_filename.c_str());
107  total_size= total_size + data.diffuse_image.width * data.diffuse_image.height * data.diffuse_image.channels * data.diffuse_image.size;
108  }
109  if(!material.ns_filename.empty())
110  {
111  data.use_ns= true;
112  data.ns_image= read_image_data(material.ns_filename.c_str());
113  total_size= total_size + data.ns_image.width * data.ns_image.height * data.ns_image.channels * data.ns_image.size;
114  }
115 
116  if(total_size > max_size)
117  {
118  // ne stocke plus les images apres avoir depasse la limite de taille
119  std::vector<unsigned char>().swap(data.diffuse_image.pixels);
120  std::vector<unsigned char>().swap(data.ns_image.pixels);
121  }
122 
123  textures.emplace_back(data);
124  }
125 
126  printf("using %dMB / %dMB\n", int(total_size / 1024 / 1024), int(max_size / 1024 / 1024));
127 
128  // reduit les dimensions des images / textures jusqu'a respecter la limite de taille
129  int lod= 0;
130  for(; total_size > max_size ; lod++)
131  {
132  total_size= 0;
133  for(int i= 0; i < (int) textures.size(); i++)
134  {
135  if(textures[i].use_diffuse)
136  total_size= total_size + miplevel_size(textures[i].diffuse_image, lod);
137  if(textures[i].use_ns)
138  total_size= total_size + miplevel_size(textures[i].ns_image, lod);
139  }
140  }
141 
142  printf(" lod %d, %dMB\n", lod, int(total_size / 1024 / 1024));
143 
144  // charge une texture par defaut, en cas d'erreur de chargement
145  GLuint default_texture= read_texture(0, "data/grid.png");
146 
147  printf("resizing textures...\n");
148  // construit les textures a la bonne resolution
149  for(int i= 0; i < (int) textures.size(); i++)
150  {
151  TextureData& data= textures[i];
152  MaterialData& material= materials[i];
153 
154  if(data.use_diffuse && data.diffuse_image.width > 0)
155  {
156  if(data.diffuse_image.pixels.empty())
157  {
158  // recharge l'image, si necessaire
159  data.diffuse_image= read_image_data(material.diffuse_filename.c_str());
160  assert(data.diffuse_image.width > 0);
161  }
162 
163  ImageData level= mipmap_resize(data.diffuse_image, lod);
164  material.diffuse_texture= make_texture(0, level);
165 
166  material.diffuse_texture_color= average_color(level);
167  }
168  else
169  material.diffuse_texture= default_texture;
170 
171  if(data.use_ns && data.ns_image.width > 0)
172  {
173  if(data.ns_image.pixels.empty())
174  {
175  // recharge l'image, si necessaire
176  data.ns_image= read_image_data(material.ns_filename.c_str());
177  assert(data.ns_image.width > 0);
178  }
179 
180  ImageData level= mipmap_resize(data.ns_image, lod);
181  material.ns_texture= make_texture(0, level);
182  }
183  else
184  material.ns_texture= default_texture;
185 
186  // nettoyage, les images ne sont plus necessaires
187  std::vector<unsigned char>().swap(data.diffuse_image.pixels);
188  std::vector<unsigned char>().swap(data.ns_image.pixels);
189  }
190 
191  return total_size;
192 }
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition: text.cpp:140
ImageData read_image_data(const char *filename)
charge les donnees d'un fichier png. renvoie une image initialisee par defaut en cas d'echec.
Definition: image_io.cpp:216
GLuint make_texture(const int unit, const int width, const int height, const GLenum texel_type, const GLenum data_format, const GLenum data_type)
creation de textures filtrables / mipmaps
Definition: texture.cpp:25
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition: texture.cpp:148
stockage temporaire des donnees d'une image.
Definition: image_io.h:38
representation d'une matiere texturee.
Definition: mesh_data.h:16
GLuint diffuse_texture
texture diffuse
Definition: mesh_data.h:21
std::string diffuse_filename
nom de la texture diffuse
Definition: mesh_data.h:20
GLuint ns_texture
texture exposant
Definition: mesh_data.h:29
std::string ns_filename
nom de la texture exposant
Definition: mesh_data.h:28
Color diffuse_texture_color
couleur moyenne de la texture
Definition: mesh_data.h:18

◆ release_textures()

void release_textures ( std::vector< MaterialData > &  materials)

detruit les textures.

Definition at line 194 of file material_data.cpp.

195 {
196  for(int i= 0; i < (int) materials.size(); i++)
197  {
198  const MaterialData& material= materials[i];
199 
200  if(material.diffuse_texture > 0)
201  glDeleteTextures(1, &material.diffuse_texture);
202  if(material.ns_texture > 0)
203  glDeleteTextures(1, &material.ns_texture);
204  }
205 }