gKit2 light
Loading...
Searching...
No Matches
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.
void release_textures (std::vector< MaterialData > &materials)
 detruit les textures.

Class Documentation

◆ TextureData

struct TextureData

Definition at line 12 of file material_data.cpp.

Class Members
ImageData diffuse_image
bool use_diffuse = false
ImageData ns_image
bool use_ns = false

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 void *buffer, const unsigned size, const bool flipY)
charge les donnees d'un fichier png stocke en memoire. renvoie une image initialisee par defaut en ca...
Definition image_io.cpp:335
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:10
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition texture.cpp:133
stockage temporaire des donnees d'une image.
Definition image_io.h:55
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}