Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/images/importer/material.cc @ 3085

Last change on this file since 3085 was 3085, checked in by bensch, 19 years ago

orxonox/branches/images: bring order to Chaos

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 Search for a Material called mtlName
98   \param mtlName the Name of the Material to search for
99   \returns Material named mtlName if it is found. NULL otherwise.
100*/
101Material* Material::search (char* mtlName)
102{
103  if (verbose >=3)
104    printf ("Searching for material %s", mtlName);
105  Material* searcher = this;
106  while (searcher != NULL)
107    {
108      if (verbose >= 3)
109        printf (".");
110      if (!strcmp (searcher->getName(), mtlName))
111        {
112          if (verbose >= 3)
113            printf ("found.\n");
114          return searcher;
115        }
116      searcher = searcher->nextMat;
117    }
118  if (verbose >=3)
119    printf ("not found\n");
120  return NULL;
121}
122
123/**
124   \brief sets the material with which the following Faces will be painted
125*/
126bool Material::select (void)
127{
128  // setting diffuse color
129  //  glColor3f (diffuse[0], diffuse[1], diffuse[2]);
130  glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
131
132  // setting ambient color
133  glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
134
135  // setting up Sprecular
136  glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
137
138  // setting up Shininess
139  glMaterialf(GL_FRONT, GL_SHININESS, shininess);
140 
141  // setting illumination Model
142  if (illumModel == 1)
143    glShadeModel(GL_FLAT);
144  else if (illumModel >= 2)
145    glShadeModel(GL_SMOOTH);
146
147  if (diffuseTextureSet)
148    glBindTexture(GL_TEXTURE_2D, diffuseTexture);
149 
150}
151
152
153/**
154   \brief Set the Name of the Material. (Important for searching)
155   \param mtlName the Name of the Material to be set.
156*/ 
157void Material::setName (char* mtlName)
158{
159  //  if (verbose >= 3)
160    printf("setting Material Name to %s.\n", mtlName);
161  name = new char [strlen(mtlName)];
162  strcpy(name, mtlName);
163  //  printf ("adding new Material: %s, %p\n", this->getName(), this);
164
165}
166/**
167   \returns The Name of The Material
168*/
169char* Material::getName (void)
170{
171  return name;
172}
173
174/**
175   \brief Sets the Material Illumination Model.
176   \brief illu illumination Model in int form
177*/
178void Material::setIllum (int illum)
179{
180  if (verbose >= 3)
181    printf("setting illumModel of Material %s to %i", name, illum);
182  illumModel = illum;
183  //  printf ("setting illumModel to: %i\n", illumModel);
184}
185/**
186   \brief Sets the Material Illumination Model.
187   \brief illu illumination Model in char* form
188*/void Material::setIllum (char* illum)
189{
190  setIllum (atoi(illum));
191}
192
193/**
194   \brief Sets the Material Diffuse Color.
195   \param r Red Color Channel.
196   \param g Green Color Channel.
197   \param b Blue Color Channel.
198*/
199void Material::setDiffuse (float r, float g, float b)
200{
201  if (verbose >= 3)
202    printf ("setting Diffuse Color of Material %s to r=%f g=%f b=%f.\n", name, r, g, b);
203  diffuse[0] = r;
204  diffuse[1] = g;
205  diffuse[2] = b; 
206  diffuse[3] = 1.0;
207
208}
209/**
210   \brief Sets the Material Diffuse Color.
211   \param rgb The red, green, blue channel in char format (with spaces between them)
212*/
213void Material::setDiffuse (char* rgb)
214{
215  char r[20],g[20],b[20];
216  sscanf (rgb, "%s %s %s", r, g, b);
217  setDiffuse (atof(r), atof(g), atof(b));
218}
219
220/**
221   \brief Sets the Material Ambient Color.
222   \param r Red Color Channel.
223   \param g Green Color Channel.
224   \param b Blue Color Channel.
225*/
226void Material::setAmbient (float r, float g, float b)
227{
228  if (verbose >=3)
229    printf ("setting Ambient Color of Material %s to r=%f g=%f b=%f.\n", name, r, g, b);
230  ambient[0] = r;
231  ambient[1] = g;
232  ambient[2] = b;
233  ambient[3] = 1.0;
234}
235/**
236   \brief Sets the Material Ambient Color.
237   \param rgb The red, green, blue channel in char format (with spaces between them)
238*/
239void Material::setAmbient (char* rgb)
240{
241  char r[20],g[20],b[20];
242  sscanf (rgb, "%s %s %s", r, g, b);
243  setAmbient (atof(r), atof(g), atof(b));
244}
245
246/**
247   \brief Sets the Material Specular Color.
248   \param r Red Color Channel.
249   \param g Green Color Channel.
250   \param b Blue Color Channel.
251*/
252void Material::setSpecular (float r, float g, float b)
253{
254  if (verbose >= 3)
255    printf ("setting Specular Color of Material %s to r=%f g=%f b=%f.\n", name, r, g, b);
256  specular[0] = r;
257  specular[1] = g;
258  specular[2] = b;
259  specular[3] = 1.0;
260 }
261/**
262   \brief Sets the Material Specular Color.
263   \param rgb The red, green, blue channel in char format (with spaces between them)
264*/
265void Material::setSpecular (char* rgb)
266{
267  char r[20],g[20],b[20];
268  sscanf (rgb, "%s %s %s", r, g, b);
269  setSpecular (atof(r), atof(g), atof(b));
270}
271
272/**
273   \brief Sets the Material Shininess.
274   \param shini stes the Shininess from float.
275*/
276void Material::setShininess (float shini)
277{
278  shininess = shini;
279}
280/**
281   \brief Sets the Material Shininess.
282   \param shini stes the Shininess from char*.
283*/
284void Material::setShininess (char* shini)
285{
286  setShininess (atof(shini));
287}
288
289/**
290   \brief Sets the Material Transparency.
291   \param trans stes the Transparency from int.
292*/
293void Material::setTransparency (float trans)
294{
295  if (verbose >= 3)
296    printf ("setting Transparency of Material %s to %f.\n", name, trans);
297  transparency = trans;
298}
299/**
300   \brief Sets the Material Transparency.
301   \param trans stes the Transparency from char*.
302*/
303void Material::setTransparency (char* trans)
304{
305  char tr[20];
306  sscanf (trans, "%s", tr);
307  setTransparency (atof(tr));
308}
309
310// MAPPING //
311
312/**
313   \brief Sets the Materials Diffuse Map
314   \param dMap the Name of the Image to Use
315*/
316void Material::setDiffuseMap(char* dMap)
317{
318  if (verbose>=2)
319    printf ("setting Diffuse Map %s\n", dMap);
320
321  diffuseTextureSet = loadBMP(dMap, &diffuseTexture);
322
323}
324
325/**
326   \brief Sets the Materials Ambient Map
327   \param aMap the Name of the Image to Use
328*/
329void Material::setAmbientMap(char* aMap)
330{
331  SDL_Surface* ambientMap;
332
333}
334
335/**
336   \brief Sets the Materials Specular Map
337   \param sMap the Name of the Image to Use
338*/
339void Material::setSpecularMap(char* sMap)
340{
341  SDL_Surface* specularMap;
342
343}
344
345/**
346   \brief Sets the Materials Bumpiness
347   \param bump the Name of the Image to Use
348*/
349void Material::setBump(char* bump)
350{
351
352}
353
354/**
355   \brief reads in a Windows BMP-file, and imports it to openGL.
356   \param bmpName The name of the Image to load.
357   \param texture A pointer to the Texture which should be read to.
358*/
359bool Material::loadBMP (char* bmpName, GLuint* texture)
360{
361  SDL_Surface* map;
362  if (map = SDL_LoadBMP(bmpName))
363    {
364
365      glGenTextures( 1, texture );
366      /* Typical Texture Generation Using Data From The Bitmap */
367      glBindTexture( GL_TEXTURE_2D, *texture );
368     
369      /* Generate The Texture */
370      glTexImage2D( GL_TEXTURE_2D, 0, 3, map->w,
371                    map->h, 0, GL_BGR,
372                    GL_UNSIGNED_BYTE, map->pixels );
373     
374      /* Linear Filtering */
375      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
376      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
377      if ( map )
378        SDL_FreeSurface( map );
379
380      return true;
381    }
382  else
383    return false;
384}
385
386
387
388
Note: See TracBrowser for help on using the repository browser.