Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/importer/material.cc @ 3105

Last change on this file since 3105 was 3080, checked in by bensch, 20 years ago

orxonox/trunk/importer: delete better in Material and Object ..cc

File size: 8.5 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16#include "material.h"
17
18/**
19   \brief creates a default Material with no Name
20   normally you call this to create a material List (for an obj-file) and then append with addMaterial()
21*/
22Material::Material()
23{
24  init();
25 
26  setName ("");
27}
28
29/**
30   \brief creates a Material.
31   \param mtlName Name of the Material to be added to the Material List
32*/
33Material::Material (char* mtlName)
34{
35  init();
36 
37  setName (mtlName);
38}
39
40/**
41    \brief deletes a Material
42*/
43Material::~Material()
44{
45  if (name)
46    delete []name;
47  if (verbose >= 2)
48    printf ("delete Material %s.\n", name);
49  if (nextMat != NULL)
50    delete nextMat;
51}
52
53/**
54   \brief adds a new Material to the List.
55   this Function will append a new Material to the end of a Material List.
56   \param mtlName The name of the Material to be added.
57*/
58Material* Material::addMaterial(char* mtlName)
59{
60  if (verbose >=2)
61    printf ("adding Material %s.\n", mtlName);
62  Material* newMat = new Material(mtlName);
63  Material* tmpMat = this;
64  while (tmpMat->nextMat != NULL)
65    {
66      tmpMat = tmpMat->nextMat;
67    }
68  tmpMat->nextMat = newMat;
69  return newMat;
70 
71}
72
73/**
74   \brief initializes a new Material with its default Values
75*/
76void Material::init(void)
77{
78  if (verbose >= 3)
79    printf ("initializing new Material.\n");
80  nextMat = NULL;
81
82  setIllum(1);
83  setDiffuse(0,0,0);
84  setAmbient(0,0,0);
85  setSpecular(0,0,0);
86  setShininess(2.0);
87  setTransparency(0.0);
88
89  diffuseTextureSet = false;
90  ambientTextureSet = false;
91  specularTextureSet = false;
92
93 
94}
95
96/**
97   \brief Set the Name of the Material. (Important for searching)
98   \param mtlName the Name of the Material to be set.
99*/ 
100void Material::setName (char* mtlName)
101{
102  //  if (verbose >= 3)
103    printf("setting Material Name to %s.\n", mtlName);
104  name = new char [strlen(mtlName)];
105  strcpy(name, mtlName);
106  //  printf ("adding new Material: %s, %p\n", this->getName(), this);
107
108}
109/**
110   \returns The Name of The Material
111*/
112char* Material::getName (void)
113{
114  return name;
115}
116
117/**
118   \brief Sets the Material Illumination Model.
119   \brief illu illumination Model in int form
120*/
121void Material::setIllum (int illum)
122{
123  if (verbose >= 3)
124    printf("setting illumModel of Material %s to %i", name, illum);
125  illumModel = illum;
126  //  printf ("setting illumModel to: %i\n", illumModel);
127}
128/**
129   \brief Sets the Material Illumination Model.
130   \brief illu illumination Model in char* form
131*/void Material::setIllum (char* illum)
132{
133  setIllum (atoi(illum));
134}
135
136/**
137   \brief Sets the Material Diffuse Color.
138   \param r Red Color Channel.
139   \param g Green Color Channel.
140   \param b Blue Color Channel.
141*/
142void Material::setDiffuse (float r, float g, float b)
143{
144  if (verbose >= 3)
145    printf ("setting Diffuse Color of Material %s to r=%f g=%f b=%f.\n", name, r, g, b);
146  diffuse[0] = r;
147  diffuse[1] = g;
148  diffuse[2] = b; 
149  diffuse[3] = 1.0;
150
151}
152/**
153   \brief Sets the Material Diffuse Color.
154   \param rgb The red, green, blue channel in char format (with spaces between them)
155*/
156void Material::setDiffuse (char* rgb)
157{
158  char r[20],g[20],b[20];
159  sscanf (rgb, "%s %s %s", r, g, b);
160  setDiffuse (atof(r), atof(g), atof(b));
161}
162
163/**
164   \brief Sets the Material Ambient Color.
165   \param r Red Color Channel.
166   \param g Green Color Channel.
167   \param b Blue Color Channel.
168*/
169void Material::setAmbient (float r, float g, float b)
170{
171  if (verbose >=3)
172    printf ("setting Ambient Color of Material %s to r=%f g=%f b=%f.\n", name, r, g, b);
173  ambient[0] = r;
174  ambient[1] = g;
175  ambient[2] = b;
176  ambient[3] = 1.0;
177}
178/**
179   \brief Sets the Material Ambient Color.
180   \param rgb The red, green, blue channel in char format (with spaces between them)
181*/
182void Material::setAmbient (char* rgb)
183{
184  char r[20],g[20],b[20];
185  sscanf (rgb, "%s %s %s", r, g, b);
186  setAmbient (atof(r), atof(g), atof(b));
187}
188
189/**
190   \brief Sets the Material Specular Color.
191   \param r Red Color Channel.
192   \param g Green Color Channel.
193   \param b Blue Color Channel.
194*/
195void Material::setSpecular (float r, float g, float b)
196{
197  if (verbose >= 3)
198    printf ("setting Specular Color of Material %s to r=%f g=%f b=%f.\n", name, r, g, b);
199  specular[0] = r;
200  specular[1] = g;
201  specular[2] = b;
202  specular[3] = 1.0;
203 }
204/**
205   \brief Sets the Material Specular Color.
206   \param rgb The red, green, blue channel in char format (with spaces between them)
207*/
208void Material::setSpecular (char* rgb)
209{
210  char r[20],g[20],b[20];
211  sscanf (rgb, "%s %s %s", r, g, b);
212  setSpecular (atof(r), atof(g), atof(b));
213}
214
215/**
216   \brief Sets the Material Shininess.
217   \param shini stes the Shininess from float.
218*/
219void Material::setShininess (float shini)
220{
221  shininess = shini;
222}
223/**
224   \brief Sets the Material Shininess.
225   \param shini stes the Shininess from char*.
226*/
227void Material::setShininess (char* shini)
228{
229  setShininess (atof(shini));
230}
231
232/**
233   \brief Sets the Material Transparency.
234   \param trans stes the Transparency from int.
235*/
236void Material::setTransparency (float trans)
237{
238  if (verbose >= 3)
239    printf ("setting Transparency of Material %s to %f.\n", name, trans);
240  transparency = trans;
241}
242/**
243   \brief Sets the Material Transparency.
244   \param trans stes the Transparency from char*.
245*/
246void Material::setTransparency (char* trans)
247{
248  char tr[20];
249  sscanf (trans, "%s", tr);
250  setTransparency (atof(tr));
251}
252
253// MAPPING //
254
255/**
256   \brief Sets the Materials Diffuse Map
257   \param dMap the Name of the Image to Use
258*/
259void Material::setDiffuseMap(char* dMap)
260{
261  if (verbose>=2)
262    printf ("setting Diffuse Map %s\n", dMap);
263
264  diffuseTextureSet = loadBMP(dMap, &diffuseTexture);
265
266}
267
268/**
269   \brief Sets the Materials Ambient Map
270   \param aMap the Name of the Image to Use
271*/
272void Material::setAmbientMap(char* aMap)
273{
274  SDL_Surface* ambientMap;
275
276}
277
278/**
279   \brief Sets the Materials Specular Map
280   \param sMap the Name of the Image to Use
281*/
282void Material::setSpecularMap(char* sMap)
283{
284  SDL_Surface* specularMap;
285
286}
287
288/**
289   \brief Sets the Materials Bumpiness
290   \param bump the Name of the Image to Use
291*/
292void Material::setBump(char* bump)
293{
294
295}
296
297/**
298   \brief reads in a Windows BMP-file, and imports it to openGL.
299   \param bmpName The name of the Image to load.
300   \param texture A pointer to the Texture which should be read to.
301*/
302bool Material::loadBMP (char* bmpName, GLuint* texture)
303{
304  SDL_Surface* map;
305  if (map = SDL_LoadBMP(bmpName))
306    {
307
308      glGenTextures( 1, texture );
309      /* Typical Texture Generation Using Data From The Bitmap */
310      glBindTexture( GL_TEXTURE_2D, *texture );
311     
312      /* Generate The Texture */
313      glTexImage2D( GL_TEXTURE_2D, 0, 3, map->w,
314                    map->h, 0, GL_BGR,
315                    GL_UNSIGNED_BYTE, map->pixels );
316     
317      /* Linear Filtering */
318      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
319      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
320      if ( map )
321        SDL_FreeSurface( map );
322
323      return true;
324    }
325  else
326    return false;
327}
328
329
330
331
332/**
333   \brief Search for a Material called mtlName
334   \param mtlName the Name of the Material to search for
335   \returns Material named mtlName if it is found. NULL otherwise.
336*/
337Material* Material::search (char* mtlName)
338{
339  if (verbose >=3)
340    printf ("Searching for material %s", mtlName);
341  Material* searcher = this;
342  while (searcher != NULL)
343    {
344      if (verbose >= 3)
345        printf (".");
346      if (!strcmp (searcher->getName(), mtlName))
347        {
348          if (verbose >= 3)
349            printf ("found.\n");
350          return searcher;
351        }
352      searcher = searcher->nextMat;
353    }
354  if (verbose >=3)
355    printf ("not found\n");
356  return NULL;
357}
358
359/**
360   \brief sets the material with which the following Faces will be painted
361*/
362bool Material::select (void)
363{
364  // setting diffuse color
365  //  glColor3f (diffuse[0], diffuse[1], diffuse[2]);
366  glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
367
368  // setting ambient color
369  glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
370
371  // setting up Sprecular
372  glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
373
374  // setting up Shininess
375  glMaterialf(GL_FRONT, GL_SHININESS, shininess);
376 
377  // setting illumination Model
378  if (illumModel == 1)
379    glShadeModel(GL_FLAT);
380  else if (illumModel >= 2)
381    glShadeModel(GL_SMOOTH);
382
383  if (diffuseTextureSet)
384    glBindTexture(GL_TEXTURE_2D, diffuseTexture);
385 
386}
Note: See TracBrowser for help on using the repository browser.