gKit2 light
materials.h
1 
2 #ifndef _MATERIALS_H
3 #define _MATERIALS_H
4 
5 #include <string>
6 #include <vector>
7 #include <cassert>
8 
9 #include "color.h"
10 
11 
15 struct Material
16 {
20  float ns;
24  int ns_texture;
25 
29  Material( const Color& color ) : diffuse(color), specular(), emission(), ns(0), diffuse_texture(-1), specular_texture(-1), emission_texture(-1), ns_texture(-1) {}
30 };
31 
32 
44 struct Materials
45 {
46  std::vector<std::string> names;
47  std::vector<Material> materials;
48  std::vector<std::string> texture_filenames;
50 
52 
54  int insert( const Material& material, const char *name )
55  {
56  int id= find(name);
57  if(id == -1)
58  {
59  id= int(materials.size());
60  names.push_back(name);
61  materials.push_back(material);
62  }
63  assert(materials.size() == names.size());
64  return id;
65  }
66 
68  int insert_texture( const char *filename )
69  {
70  int id= find_texture(filename);
71  if(id == -1)
72  {
73  id= int(texture_filenames.size());
74  texture_filenames.push_back(filename);
75  }
76  return id;
77  }
78 
80  int find( const char *name )
81  {
82  if(name == nullptr || name[0] == 0)
83  return -1;
84 
85  for(int i= 0; i < int(names.size()); i++)
86  {
87  if(names[i] == name)
88  return i;
89  }
90  return -1;
91  }
92 
94  int count( ) const { return int(materials.size()); }
95 
97  const char *name( const int id ) const { assert(id != -1); assert(id < int(materials.size())); return names[id].c_str(); }
99  const char *name( const int id ) { assert(id != -1); assert(id < int(materials.size())); return names[id].c_str(); }
100 
102  const Material& material( const int id ) const { assert(id != -1); assert(id < int(materials.size())); return materials[id]; }
104  Material& material( const int id ) { assert(id != -1); assert(id < int(materials.size())); return materials[id]; }
105 
107  const Material& operator() ( const int id ) const { return material(id); }
109  Material& operator() ( const int id ) { return material(id); }
110 
112  const Material& material( const char *name )
113  {
114  int id= find(name);
115  if(id != -1)
116  // renvoie la matiere
117  return materials[id];
118  else
119  // ou renvoie la matiere par defaut...
120  return default_material();
121  }
122 
125  {
127  }
128 
131  {
132  if(default_material_id == -1)
133  default_material_id= insert(Material(Color(0.8)), "default");
134 
135  return default_material_id;
136  }
137 
139  int filename_count( ) const { return int(texture_filenames.size()); }
141  const char *filename( const int id ) const { return texture_filenames[id].c_str(); }
142 
144  int find_texture( const char *filename )
145  {
146  if(filename == nullptr || filename[0] == 0)
147  return -1;
148 
149  for(int i= 0; i < int(texture_filenames.size()); i++)
150  {
151  if(texture_filenames[i] == filename)
152  return i;
153  }
154  return -1;
155  }
156 };
157 
158 #endif
representation d'une couleur (rgba) transparente ou opaque.
Definition: color.h:14
Material()
constructeur par defaut. noir.
Definition: materials.h:27
int diffuse_texture
indice de la texture de la couleur de base, ou -1.
Definition: materials.h:21
float ns
concentration des reflets, exposant pour les reflets blinn-phong.
Definition: materials.h:20
int ns_texture
indice de la texture de reflet, ou -1.
Definition: materials.h:24
Color emission
pour une source de lumiere.
Definition: materials.h:19
Color diffuse
couleur diffuse / de base.
Definition: materials.h:17
Material(const Color &color)
matiere diffuse.
Definition: materials.h:29
int emission_texture
indice de la texture, ou -1.
Definition: materials.h:23
Color specular
couleur du reflet.
Definition: materials.h:18
int specular_texture
indice de la texture, ou -1.
Definition: materials.h:22
Material & material(const int id)
renvoie la ieme matiere.
Definition: materials.h:104
const char * name(const int id)
renvoie le nom de la ieme matiere.
Definition: materials.h:99
std::vector< std::string > names
noms des matieres.
Definition: materials.h:46
int insert(const Material &material, const char *name)
ajoute une matiere.
Definition: materials.h:54
int filename_count() const
renvoie le nombre de noms de fichiers de textures.
Definition: materials.h:139
const Material & material(const int id) const
renvoie la ieme matiere.
Definition: materials.h:102
int find_texture(const char *filename)
renvoie l'indice d'une texture, si elle existe.
Definition: materials.h:144
const Material & material(const char *name)
renvoie la matiere 'name', si elle existe. ou la matiere par defaut.
Definition: materials.h:112
int find(const char *name)
recherche une matiere avec son nom. renvoie son indice dans materials, ou -1.
Definition: materials.h:80
int insert_texture(const char *filename)
ajoute une texture / nom du fichier.
Definition: materials.h:68
std::vector< std::string > texture_filenames
noms des textures a charger.
Definition: materials.h:48
int count() const
nombre de matieres.
Definition: materials.h:94
const char * filename(const int id) const
renvoie le nombre de noms de fichiers de textures.
Definition: materials.h:141
int default_material_id
indice de la matiere par defaut dans materials.
Definition: materials.h:49
const Material & operator()(const int id) const
renvoie la ieme matiere.
Definition: materials.h:107
const Material & default_material()
renvoie une matiere par defaut.
Definition: materials.h:124
std::vector< Material > materials
description des matieres.
Definition: materials.h:47
const char * name(const int id) const
renvoie le nom de la ieme matiere.
Definition: materials.h:97
int default_material_index()
indice de la matiere par defaut dans le tableau materials.
Definition: materials.h:130