Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
gl_material.cpp
Go to the documentation of this file.
1 /*
2  * Vega Strike
3  * Copyright (C) 2001-2002 Daniel Horn & Alan Shieh
4  *
5  * http://vegastrike.sourceforge.net/
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */
21 
22 #include "gfxlib.h"
23 #include "gl_globals.h"
24 #include <cstring>
25 //#include "gl_globals.h"
26 //#include "gfx_transform_vector.h"
27 
28 static vector< GFXMaterial >materialinfo;
29 static int selectedmaterial = -1;
30 void /*GFXDRVAPI*/ GFXSetMaterial( unsigned int &number, const GFXMaterial &material )
31 {
32  number = (unsigned int) -1; //intended warning for unsigned....
33  for (unsigned int i = 0; i < materialinfo.size(); i++)
34  if (memcmp( &materialinfo[i], &material, sizeof (GFXMaterial) ) == 0) {
35  number = i;
36  break;
37  }
38  if ( number == (unsigned int) (-1) ) {
39  //another intended warning
40  number = materialinfo.size();
41  materialinfo.push_back( material );
42  }
43 }
44 
45 void /*GFXDRVAPI*/ GFXModifyMaterial( const unsigned int number, const GFXMaterial &material )
46 {
47  materialinfo[number] = material;
48 }
49 
50 const GFXMaterial& /*GFXDRVAPI*/ GFXGetMaterial( const unsigned int number )
51 {
52  if ( number >= materialinfo.size() ) {
53  static GFXMaterial tmp;
54  return tmp;
55  }
56  return materialinfo[number];
57 }
58 GFXBOOL /*GFXDRVAPI*/ GFXGetMaterial( const unsigned int number, GFXMaterial &material )
59 {
60  if ( (number == (unsigned int) -1) || number >= materialinfo.size() )
61  return GFXFALSE;
62  material = materialinfo[number];
63  return GFXTRUE;
64 }
65 void /*GFXDRVAPI*/ GFXSelectMaterialAlpha( const unsigned int number, float alpha )
66 {
67  selectedmaterial = -1;
68  float matvect[4];
69  matvect[0] = materialinfo[number].ar;
70  matvect[1] = materialinfo[number].ag;
71  matvect[2] = materialinfo[number].ab;
72  matvect[3] = materialinfo[number].aa*alpha;
73  glMaterialfv( GL_FRONT, GL_AMBIENT, matvect );
74 
75  matvect[0] = materialinfo[number].dr;
76  matvect[1] = materialinfo[number].dg;
77  matvect[2] = materialinfo[number].db;
78  matvect[3] = materialinfo[number].da*alpha;
79  glMaterialfv( GL_FRONT, GL_DIFFUSE, matvect );
80 
81  matvect[0] = materialinfo[number].sr;
82  matvect[1] = materialinfo[number].sg;
83  matvect[2] = materialinfo[number].sb;
84  matvect[3] = materialinfo[number].sa*alpha;
85  glMaterialfv( GL_FRONT, GL_SPECULAR, matvect );
86 
87  matvect[0] = materialinfo[number].er;
88  matvect[1] = materialinfo[number].eg;
89  matvect[2] = materialinfo[number].eb;
90  matvect[3] = materialinfo[number].ea*alpha;
91  glMaterialfv( GL_FRONT, GL_EMISSION, matvect );
92 
93  glMaterialfv( GL_FRONT, GL_SHININESS, &materialinfo[number].power );
94 }
95 const float zerovect[4] = {0.0};
96 void /*GFXDRVAPI*/ GFXSelectMaterialHighlights( const unsigned int number,
97  const GFXColor &ambient,
98  const GFXColor &diffuse,
99  const GFXColor &specular,
100  const GFXColor &emissive )
101 {
102  selectedmaterial = -1;
103  float matvect[4];
104  matvect[0] = materialinfo[number].ar*ambient.r*ambient.a;
105  matvect[1] = materialinfo[number].ag*ambient.g*ambient.a;
106  matvect[2] = materialinfo[number].ab*ambient.b*ambient.a;
107  matvect[3] = materialinfo[number].aa*ambient.a;
108  glMaterialfv( GL_FRONT, GL_AMBIENT, matvect );
109 
110  matvect[0] = materialinfo[number].dr*diffuse.r*diffuse.a;
111  matvect[1] = materialinfo[number].dg*diffuse.g*diffuse.a;
112  matvect[2] = materialinfo[number].db*diffuse.b*diffuse.a;
113  matvect[3] = materialinfo[number].da*diffuse.a;
114  glMaterialfv( GL_FRONT, GL_DIFFUSE, matvect );
115 
116  matvect[0] = materialinfo[number].sr*specular.r*specular.a;
117  matvect[1] = materialinfo[number].sg*specular.g*specular.a;
118  matvect[2] = materialinfo[number].sb*specular.b*specular.a;
119  matvect[3] = materialinfo[number].sa*specular.a;
120  glMaterialfv( GL_FRONT, GL_SPECULAR, matvect );
121 
122  matvect[0] = emissive.r*emissive.a;
123  matvect[1] = emissive.g*emissive.a;
124  matvect[2] = emissive.b*emissive.a;
125  matvect[3] = emissive.a;
126  glMaterialfv( GL_FRONT, GL_EMISSION, matvect );
127 
128  glMaterialfv( GL_FRONT, GL_SHININESS, &materialinfo[number].power );
129 }
130 
131 void /*GFXDRVAPI*/ GFXSelectMaterial( const unsigned int number )
132 {
133  if (1 || static_cast<int>(number) != selectedmaterial) { //FIXME Last time I checked true or anything was true
134  float matvect[4];
135  matvect[0] = materialinfo[number].ar;
136  matvect[1] = materialinfo[number].ag;
137  matvect[2] = materialinfo[number].ab;
138  matvect[3] = materialinfo[number].aa;
139  glMaterialfv( GL_FRONT, GL_AMBIENT, matvect );
140 
141  matvect[0] = materialinfo[number].dr;
142  matvect[1] = materialinfo[number].dg;
143  matvect[2] = materialinfo[number].db;
144  matvect[3] = materialinfo[number].da;
145  glMaterialfv( GL_FRONT, GL_DIFFUSE, matvect );
146 
147  matvect[0] = materialinfo[number].sr;
148  matvect[1] = materialinfo[number].sg;
149  matvect[2] = materialinfo[number].sb;
150  matvect[3] = materialinfo[number].sa;
151  glMaterialfv( GL_FRONT, GL_SPECULAR, matvect );
152 
153  matvect[0] = materialinfo[number].er;
154  matvect[1] = materialinfo[number].eg;
155  matvect[2] = materialinfo[number].eb;
156  matvect[3] = materialinfo[number].ea;
157  glMaterialfv( GL_FRONT, GL_EMISSION, matvect );
158 
159  glMaterialfv( GL_FRONT, GL_SHININESS, &materialinfo[number].power );
160  selectedmaterial = number;
161  }
162 }
163