rev |
line source |
nuclear@0
|
1 #include "objects.h"
|
nuclear@0
|
2 #include "3dengine.h"
|
nuclear@0
|
3 #include "objectgen.h"
|
nuclear@0
|
4
|
nuclear@0
|
5 Object::Object(GraphicsContext *gc, byte DetailLevels) {
|
nuclear@0
|
6 this->gc = gc;
|
nuclear@0
|
7
|
nuclear@0
|
8 mesh = new TriMesh(DetailLevels, gc);
|
nuclear@0
|
9
|
nuclear@0
|
10 SetShadingMode(GouraudShading);
|
nuclear@0
|
11 SetVertexProgram(FixedFunction);
|
nuclear@0
|
12 SetPixelProgram(0);
|
nuclear@0
|
13 rendp.Billboarded = false;
|
nuclear@0
|
14 rendp.SourceBlendFactor = BLEND_SRCALPHA;
|
nuclear@0
|
15 rendp.DestBlendFactor = BLEND_INVSRCALPHA;
|
nuclear@0
|
16 rendp.ZWrite = true;
|
nuclear@0
|
17 ShadowCount = 0;
|
nuclear@0
|
18 UseTextureMatrix = false;
|
nuclear@0
|
19
|
nuclear@0
|
20 ShadowVolumes = 0;
|
nuclear@0
|
21 CastShadows = false;
|
nuclear@0
|
22
|
nuclear@0
|
23 AutoSetZWrite = true;
|
nuclear@0
|
24 }
|
nuclear@0
|
25
|
nuclear@0
|
26 Object::~Object() {
|
nuclear@0
|
27 delete mesh;
|
nuclear@0
|
28 if(rendp.VertexProgram != FixedFunction) gc->DestroyVertexProgram(rendp.VertexProgram);
|
nuclear@0
|
29 }
|
nuclear@0
|
30
|
nuclear@0
|
31 TriMesh *Object::GetTriMesh() {
|
nuclear@0
|
32 return mesh;
|
nuclear@0
|
33 }
|
nuclear@0
|
34
|
nuclear@0
|
35
|
nuclear@0
|
36 // Reset Transformation Matrices
|
nuclear@0
|
37 void Object::ResetTransform() {
|
nuclear@0
|
38 TransMat.ResetIdentity();
|
nuclear@0
|
39 RotMat.ResetIdentity();
|
nuclear@0
|
40 GRotMat.ResetIdentity();
|
nuclear@0
|
41 ScaleMat.ResetIdentity();
|
nuclear@0
|
42 }
|
nuclear@0
|
43
|
nuclear@0
|
44 void Object::ResetTranslation() {
|
nuclear@0
|
45 TransMat.ResetIdentity();
|
nuclear@0
|
46 }
|
nuclear@0
|
47
|
nuclear@0
|
48 void Object::ResetRotation() {
|
nuclear@0
|
49 RotMat.ResetIdentity();
|
nuclear@0
|
50 }
|
nuclear@0
|
51
|
nuclear@0
|
52 void Object::ResetGlobalRotation() {
|
nuclear@0
|
53 GRotMat.ResetIdentity();
|
nuclear@0
|
54 }
|
nuclear@0
|
55
|
nuclear@0
|
56 void Object::ResetScaling() {
|
nuclear@0
|
57 ScaleMat.ResetIdentity();
|
nuclear@0
|
58 }
|
nuclear@0
|
59
|
nuclear@0
|
60 // Concatenate additional transformations
|
nuclear@0
|
61 void Object::Translate(float tx, float ty, float tz) {
|
nuclear@0
|
62 TransMat.Translate(tx, ty, tz);
|
nuclear@0
|
63 }
|
nuclear@0
|
64
|
nuclear@0
|
65 void Object::Rotate(float rx, float ry, float rz) {
|
nuclear@0
|
66 RotMat.Rotate(rx, ry, rz);
|
nuclear@0
|
67 }
|
nuclear@0
|
68
|
nuclear@0
|
69 void Object::Rotate(const Vector3 &axis, float angle) {
|
nuclear@0
|
70 RotMat.Rotate(axis, angle);
|
nuclear@0
|
71 }
|
nuclear@0
|
72
|
nuclear@0
|
73 void Object::Rotate(const Matrix4x4 &rot) {
|
nuclear@0
|
74 RotMat *= rot;
|
nuclear@0
|
75 }
|
nuclear@0
|
76
|
nuclear@0
|
77 void Object::GlobalRotate(float rx, float ry, float rz) {
|
nuclear@0
|
78 GRotMat.Rotate(rx, ry, rz);
|
nuclear@0
|
79 }
|
nuclear@0
|
80
|
nuclear@0
|
81 void Object::GlobalRotate(const Vector3 &axis, float angle) {
|
nuclear@0
|
82 GRotMat.Rotate(axis, angle);
|
nuclear@0
|
83 }
|
nuclear@0
|
84
|
nuclear@0
|
85 void Object::GlobalRotate(const Matrix4x4 &rot) {
|
nuclear@0
|
86 GRotMat *= rot;
|
nuclear@0
|
87 }
|
nuclear@0
|
88
|
nuclear@0
|
89 void Object::Scale(float sx, float sy, float sz) {
|
nuclear@0
|
90 ScaleMat.Scale(sx, sy, sz);
|
nuclear@0
|
91 }
|
nuclear@0
|
92
|
nuclear@0
|
93 void Object::SetTranslation(float tx, float ty, float tz) {
|
nuclear@0
|
94 TransMat.SetTranslation(tx, ty, tz);
|
nuclear@0
|
95 }
|
nuclear@0
|
96
|
nuclear@0
|
97 void Object::SetRotation(float rx, float ry, float rz) {
|
nuclear@0
|
98 RotMat.Rotate(rx, ry, rz);
|
nuclear@0
|
99 }
|
nuclear@0
|
100
|
nuclear@0
|
101 void Object::SetRotation(const Vector3 &axis, float angle) {
|
nuclear@0
|
102 RotMat.Rotate(axis, angle);
|
nuclear@0
|
103 }
|
nuclear@0
|
104
|
nuclear@0
|
105 void Object::SetRotation(const Matrix4x4 &rot) {
|
nuclear@0
|
106 RotMat = rot;
|
nuclear@0
|
107 }
|
nuclear@0
|
108
|
nuclear@0
|
109 void Object::SetGlobalRotation(float rx, float ry, float rz) {
|
nuclear@0
|
110 GRotMat.Rotate(rx, ry, rz);
|
nuclear@0
|
111 }
|
nuclear@0
|
112
|
nuclear@0
|
113 void Object::SetGlobalRotation(const Vector3 &axis, float angle) {
|
nuclear@0
|
114 GRotMat.Rotate(axis, angle);
|
nuclear@0
|
115 }
|
nuclear@0
|
116
|
nuclear@0
|
117 void Object::SetGlobalRotation(const Matrix4x4 &rot) {
|
nuclear@0
|
118 GRotMat = rot;
|
nuclear@0
|
119 }
|
nuclear@0
|
120
|
nuclear@0
|
121 void Object::SetScaling(float sx, float sy, float sz) {
|
nuclear@0
|
122 ScaleMat.Scale(sx, sy, sz);
|
nuclear@0
|
123 }
|
nuclear@0
|
124
|
nuclear@0
|
125 const Matrix4x4 Object::GetWorldTransform() const {
|
nuclear@0
|
126 return ScaleMat * RotMat * TransMat * GRotMat;
|
nuclear@0
|
127 }
|
nuclear@0
|
128
|
nuclear@0
|
129 void Object::SetTextureMatrix(Matrix4x4 mat) {
|
nuclear@0
|
130 UseTextureMatrix = true;
|
nuclear@0
|
131 TextureMatrix = mat;
|
nuclear@0
|
132 }
|
nuclear@0
|
133
|
nuclear@0
|
134 Matrix4x4 Object::GetTextureMatrix() const {
|
nuclear@0
|
135 return TextureMatrix;
|
nuclear@0
|
136 }
|
nuclear@0
|
137
|
nuclear@0
|
138 void Object::SetVertexProgram(dword VertexProgram) {
|
nuclear@0
|
139 rendp.VertexProgram = VertexProgram;
|
nuclear@0
|
140 }
|
nuclear@0
|
141
|
nuclear@0
|
142 void Object::SetPixelProgram(dword PixelProgram) {
|
nuclear@0
|
143 rendp.PixelProgram = PixelProgram;
|
nuclear@0
|
144 }
|
nuclear@0
|
145
|
nuclear@0
|
146 void Object::SetShadingMode(ShadeMode smode) {
|
nuclear@0
|
147 rendp.Shading = smode;
|
nuclear@0
|
148 }
|
nuclear@0
|
149
|
nuclear@0
|
150 void Object::SetWriteZBuffer(bool enable) {
|
nuclear@0
|
151 rendp.ZWrite = enable;
|
nuclear@0
|
152 AutoSetZWrite = false;
|
nuclear@0
|
153 }
|
nuclear@0
|
154
|
nuclear@0
|
155 void Object::SetBlendFunc(BlendingFactor src, BlendingFactor dest) {
|
nuclear@0
|
156 rendp.SourceBlendFactor = src;
|
nuclear@0
|
157 rendp.DestBlendFactor = dest;
|
nuclear@0
|
158 }
|
nuclear@0
|
159
|
nuclear@0
|
160 void Object::GetBlendFunc(BlendingFactor *src, BlendingFactor *dest) {
|
nuclear@0
|
161 *src = rendp.SourceBlendFactor;
|
nuclear@0
|
162 *dest = rendp.DestBlendFactor;
|
nuclear@0
|
163 }
|
nuclear@0
|
164
|
nuclear@0
|
165 void Object::CalculateShadows(const Light **lights, int LightCount) {
|
nuclear@0
|
166 if(ShadowVolumes) {
|
nuclear@0
|
167 for(int i=0; i<ShadowCount; i++) {
|
nuclear@0
|
168 delete ShadowVolumes[i];
|
nuclear@0
|
169 }
|
nuclear@0
|
170 delete ShadowVolumes;
|
nuclear@0
|
171 }
|
nuclear@0
|
172
|
nuclear@0
|
173 ShadowVolumes = new TriMesh*[LightCount];
|
nuclear@0
|
174 for(int i=0; i<LightCount; i++) {
|
nuclear@0
|
175 ShadowVolumes[i] = CreateShadowVolume(*mesh, lights[i], GetWorldTransform());
|
nuclear@0
|
176 }
|
nuclear@0
|
177
|
nuclear@0
|
178 ShadowCount = LightCount;
|
nuclear@0
|
179 }
|
nuclear@0
|
180
|
nuclear@0
|
181 TriMesh *Object::GetShadowVolume(int light) {
|
nuclear@0
|
182 if(light >= ShadowCount) return 0;
|
nuclear@0
|
183 return ShadowVolumes[light];
|
nuclear@0
|
184 }
|
nuclear@0
|
185
|
nuclear@0
|
186 void Object::SetShadowCasting(bool enable) {
|
nuclear@0
|
187 CastShadows = enable;
|
nuclear@0
|
188 }
|
nuclear@0
|
189
|
nuclear@0
|
190 bool Object::GetShadowCasting() const {
|
nuclear@0
|
191 return CastShadows;
|
nuclear@0
|
192 }
|
nuclear@0
|
193
|
nuclear@0
|
194 ///////////////////////////
|
nuclear@0
|
195
|
nuclear@0
|
196 void Object::SetRenderStates() {
|
nuclear@0
|
197 gc->SetWorldMatrix(GetWorldTransform());
|
nuclear@0
|
198
|
nuclear@0
|
199 gc->SetMaterial(material);
|
nuclear@0
|
200 if(AutoSetZWrite && material.Alpha < 0.991f) rendp.ZWrite = false;
|
nuclear@0
|
201 gc->SetSpecular(material.SpecularEnable);
|
nuclear@0
|
202
|
nuclear@0
|
203 gc->SetVertexProgram(rendp.VertexProgram);
|
nuclear@0
|
204 gc->SetPixelProgram(rendp.PixelProgram);
|
nuclear@0
|
205 gc->SetShadingMode(rendp.Shading);
|
nuclear@0
|
206 }
|
nuclear@0
|
207
|
nuclear@0
|
208 void Object::Render() {
|
nuclear@0
|
209 int TexUnits = gc->GetTextureStageNumber();
|
nuclear@0
|
210
|
nuclear@0
|
211 if(TexUnits < 4) {
|
nuclear@0
|
212 Render2TexUnits();
|
nuclear@0
|
213 } else if(TexUnits < 8) {
|
nuclear@0
|
214 Render4TexUnits();
|
nuclear@0
|
215 } else {
|
nuclear@0
|
216 Render8TexUnits();
|
nuclear@0
|
217 }
|
nuclear@0
|
218 }
|
nuclear@0
|
219
|
nuclear@0
|
220 void Object::Render2TexUnits() {
|
nuclear@0
|
221
|
nuclear@0
|
222 SetRenderStates();
|
nuclear@0
|
223
|
nuclear@0
|
224 VertexBuffer *vb = const_cast<VertexBuffer*>(mesh->GetVertexBuffer());
|
nuclear@0
|
225 IndexBuffer *ib = const_cast<IndexBuffer*>(mesh->GetIndexBuffer());
|
nuclear@0
|
226
|
nuclear@0
|
227 Material mat = material;
|
nuclear@0
|
228
|
nuclear@0
|
229 int TexCount = 0;
|
nuclear@0
|
230 for(int i=0; i<NumberOfTextureTypes; i++) {
|
nuclear@0
|
231 if(mat.Maps[i]) TexCount++;
|
nuclear@0
|
232 }
|
nuclear@0
|
233
|
nuclear@0
|
234 if(!rendp.ZWrite) gc->SetZWrite(false);
|
nuclear@0
|
235
|
nuclear@0
|
236 if(!TexCount) {
|
nuclear@0
|
237 // render without any texture
|
nuclear@0
|
238 gc->SetTexture(0, 0);
|
nuclear@0
|
239 gc->SetTextureStageColor(0, TexBlendSelectArg1, TexArgDiffuseColor, TexArgTexture);
|
nuclear@0
|
240 if(mat.Alpha < 1.0f) {
|
nuclear@0
|
241 gc->SetTextureFactor(Color(mat.Alpha, mat.Alpha, mat.Alpha, mat.Alpha).GetPacked32());
|
nuclear@0
|
242 gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgFactor, TexArgDiffuseColor);
|
nuclear@0
|
243 } else {
|
nuclear@0
|
244 gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
245 }
|
nuclear@0
|
246 gc->DisableTextureStage(1);
|
nuclear@0
|
247
|
nuclear@0
|
248 gc->SetAlphaBlending(true);
|
nuclear@0
|
249 gc->SetBlendFunc(rendp.SourceBlendFactor, rendp.DestBlendFactor);
|
nuclear@0
|
250 gc->Draw(vb, ib);
|
nuclear@0
|
251 gc->SetAlphaBlending(false);
|
nuclear@0
|
252 } else {
|
nuclear@0
|
253
|
nuclear@0
|
254 ////////// pass 1 (texture & env) ///////////
|
nuclear@0
|
255 int stage = 0;
|
nuclear@0
|
256 if(mat.Maps[TextureMap]) {
|
nuclear@0
|
257 if(UseTextureMatrix) gc->SetTextureMatrix(TextureMatrix, 0);
|
nuclear@0
|
258 gc->SetTexture(stage, mat.Maps[TextureMap]);
|
nuclear@0
|
259 gc->SetTextureStageColor(stage, TexBlendModulate, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
260 if(mat.Alpha < 1.0f) {
|
nuclear@0
|
261 gc->SetTextureFactor(Color(mat.Alpha, mat.Alpha, mat.Alpha, mat.Alpha).GetPacked32());
|
nuclear@0
|
262 gc->SetTextureStageAlpha(stage, TexBlendModulate, TexArgTexture, TexArgFactor);
|
nuclear@0
|
263 } else {
|
nuclear@0
|
264 gc->SetTextureStageAlpha(stage, TexBlendSelectArg2, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
265 }
|
nuclear@0
|
266 gc->SetTextureCoordIndex(stage, 0);
|
nuclear@0
|
267 stage++;
|
nuclear@0
|
268 }
|
nuclear@0
|
269
|
nuclear@0
|
270 if(mat.Maps[EnvironmentMap]) {
|
nuclear@0
|
271 gc->SetTexture(stage, mat.Maps[EnvironmentMap]);
|
nuclear@0
|
272 gc->SetTextureStageColor(stage, TexBlendAdd, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
273 gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
274 Matrix4x4 TexMat = Matrix4x4(0.5f, 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, 0.0f, 1.0f);
|
nuclear@0
|
275 gc->SetTextureMatrix(TexMat, stage);
|
nuclear@0
|
276 gc->D3DDevice->SetTextureStageState(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
|
nuclear@0
|
277 gc->D3DDevice->SetTextureStageState(stage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL);
|
nuclear@0
|
278 stage++;
|
nuclear@0
|
279 }
|
nuclear@0
|
280
|
nuclear@0
|
281 gc->SetTexture(stage, 0);
|
nuclear@0
|
282 gc->DisableTextureStage(stage);
|
nuclear@0
|
283
|
nuclear@0
|
284 if(stage > 0) {
|
nuclear@0
|
285 gc->SetAlphaBlending(true);
|
nuclear@0
|
286 gc->SetBlendFunc(rendp.SourceBlendFactor, rendp.DestBlendFactor);
|
nuclear@0
|
287 gc->Draw(vb, ib);
|
nuclear@0
|
288 gc->SetAlphaBlending(false);
|
nuclear@0
|
289
|
nuclear@0
|
290 gc->SetTextureMatrix(Matrix4x4(), 0);
|
nuclear@0
|
291 gc->SetTextureMatrix(Matrix4x4(), 1);
|
nuclear@0
|
292 }
|
nuclear@0
|
293
|
nuclear@0
|
294 ////////// pass 2 (Bump & Lightmap) //////////
|
nuclear@0
|
295 if(stage > 0) { // did a first pass
|
nuclear@0
|
296 gc->SetAlphaBlending(true);
|
nuclear@0
|
297 gc->SetBlendFunc(BLEND_DESTCOLOR, BLEND_ZERO); // mult blend
|
nuclear@0
|
298 mat.Emissive = Color(1.0f); // do not recalculate lighting
|
nuclear@0
|
299 }
|
nuclear@0
|
300
|
nuclear@0
|
301 stage = 0;
|
nuclear@0
|
302 if(mat.Maps[LightMap]) {
|
nuclear@0
|
303 gc->SetTexture(stage, mat.Maps[LightMap]);
|
nuclear@0
|
304 gc->SetTextureStageColor(stage, TexBlendSelectArg2, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
305 gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
306 gc->SetTextureCoordIndex(stage, 1);
|
nuclear@0
|
307 stage++;
|
nuclear@0
|
308 }
|
nuclear@0
|
309
|
nuclear@0
|
310 if(mat.Maps[BumpMap]) {
|
nuclear@0
|
311 // re-implementation due
|
nuclear@0
|
312 }
|
nuclear@0
|
313
|
nuclear@0
|
314 gc->SetTexture(stage, 0);
|
nuclear@0
|
315 gc->DisableTextureStage(stage);
|
nuclear@0
|
316
|
nuclear@0
|
317 if(stage > 0) gc->Draw(vb, ib);
|
nuclear@0
|
318
|
nuclear@0
|
319 gc->SetAlphaBlending(false);
|
nuclear@0
|
320 }
|
nuclear@0
|
321
|
nuclear@0
|
322 if(!rendp.ZWrite) gc->SetZWrite(true);
|
nuclear@0
|
323 }
|
nuclear@0
|
324
|
nuclear@0
|
325
|
nuclear@0
|
326 void Object::Render4TexUnits() {
|
nuclear@0
|
327 SetRenderStates();
|
nuclear@0
|
328
|
nuclear@0
|
329 VertexBuffer *vb = const_cast<VertexBuffer*>(mesh->GetVertexBuffer());
|
nuclear@0
|
330 IndexBuffer *ib = const_cast<IndexBuffer*>(mesh->GetIndexBuffer());
|
nuclear@0
|
331
|
nuclear@0
|
332 Material mat = material;
|
nuclear@0
|
333
|
nuclear@0
|
334 int TexCount = 0;
|
nuclear@0
|
335 for(int i=0; i<NumberOfTextureTypes; i++) {
|
nuclear@0
|
336 if(mat.Maps[i]) TexCount++;
|
nuclear@0
|
337 }
|
nuclear@0
|
338
|
nuclear@0
|
339 if(!rendp.ZWrite) gc->SetZWrite(false);
|
nuclear@0
|
340
|
nuclear@0
|
341 if(!TexCount) {
|
nuclear@0
|
342 // render without any texture
|
nuclear@0
|
343 gc->SetTexture(0, 0);
|
nuclear@0
|
344 gc->SetTextureStageColor(0, TexBlendSelectArg1, TexArgDiffuseColor, TexArgTexture);
|
nuclear@0
|
345 if(mat.Alpha < 1.0f) {
|
nuclear@0
|
346 gc->SetTextureFactor(Color(mat.Alpha, mat.Alpha, mat.Alpha, mat.Alpha).GetPacked32());
|
nuclear@0
|
347 gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgFactor, TexArgDiffuseColor);
|
nuclear@0
|
348 } else {
|
nuclear@0
|
349 gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
350 }
|
nuclear@0
|
351 gc->DisableTextureStage(1);
|
nuclear@0
|
352
|
nuclear@0
|
353 gc->SetAlphaBlending(true);
|
nuclear@0
|
354 gc->SetBlendFunc(rendp.SourceBlendFactor, rendp.DestBlendFactor);
|
nuclear@0
|
355 gc->Draw(vb, ib);
|
nuclear@0
|
356 gc->SetAlphaBlending(false);
|
nuclear@0
|
357 } else {
|
nuclear@0
|
358
|
nuclear@0
|
359 ////////// pass 1 (texture, detail, env, bump) ///////////
|
nuclear@0
|
360 int stage = 0;
|
nuclear@0
|
361 if(mat.Maps[TextureMap]) {
|
nuclear@0
|
362 if(UseTextureMatrix) gc->SetTextureMatrix(TextureMatrix, 0);
|
nuclear@0
|
363 gc->SetTexture(stage, mat.Maps[TextureMap]);
|
nuclear@0
|
364 gc->SetTextureStageColor(stage, TexBlendModulate, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
365 if(mat.Alpha < 1.0f) {
|
nuclear@0
|
366 gc->SetTextureFactor(Color(mat.Alpha, mat.Alpha, mat.Alpha, mat.Alpha).GetPacked32());
|
nuclear@0
|
367 gc->SetTextureStageAlpha(stage, TexBlendModulate, TexArgTexture, TexArgFactor);
|
nuclear@0
|
368 } else {
|
nuclear@0
|
369 gc->SetTextureStageAlpha(stage, TexBlendSelectArg2, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
370 }
|
nuclear@0
|
371 gc->SetTextureCoordIndex(stage, 0);
|
nuclear@0
|
372 stage++;
|
nuclear@0
|
373 }
|
nuclear@0
|
374
|
nuclear@0
|
375 if(mat.Maps[DetailMap]) {
|
nuclear@0
|
376 gc->SetTexture(stage, mat.Maps[DetailMap]);
|
nuclear@0
|
377 gc->SetTextureStageColor(stage, TexBlendAdd, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
378 gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
379 gc->SetTextureCoordIndex(stage, 1);
|
nuclear@0
|
380 stage++;
|
nuclear@0
|
381 }
|
nuclear@0
|
382
|
nuclear@0
|
383 if(mat.Maps[EnvironmentMap]) {
|
nuclear@0
|
384 gc->SetTexture(stage, mat.Maps[EnvironmentMap]);
|
nuclear@0
|
385 gc->SetTextureStageColor(stage, TexBlendAdd, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
386 gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
387 Matrix4x4 TexMat = Matrix4x4(0.5f, 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, 0.0f, 1.0f);
|
nuclear@0
|
388 gc->SetTextureMatrix(TexMat, stage);
|
nuclear@0
|
389 gc->D3DDevice->SetTextureStageState(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
|
nuclear@0
|
390 gc->D3DDevice->SetTextureStageState(stage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL);
|
nuclear@0
|
391 stage++;
|
nuclear@0
|
392 }
|
nuclear@0
|
393
|
nuclear@0
|
394 if(mat.Maps[BumpMap]) {
|
nuclear@0
|
395 // re-implementation due
|
nuclear@0
|
396 }
|
nuclear@0
|
397
|
nuclear@0
|
398 gc->SetTexture(stage, 0);
|
nuclear@0
|
399 gc->DisableTextureStage(stage);
|
nuclear@0
|
400
|
nuclear@0
|
401 if(stage > 0) {
|
nuclear@0
|
402 gc->SetAlphaBlending(true);
|
nuclear@0
|
403 gc->SetBlendFunc(rendp.SourceBlendFactor, rendp.DestBlendFactor);
|
nuclear@0
|
404 gc->Draw(vb, ib);
|
nuclear@0
|
405 gc->SetAlphaBlending(false);
|
nuclear@0
|
406
|
nuclear@0
|
407 gc->SetTextureMatrix(Matrix4x4(), 0);
|
nuclear@0
|
408 gc->SetTextureMatrix(Matrix4x4(), 1);
|
nuclear@0
|
409 gc->SetTextureMatrix(Matrix4x4(), 2);
|
nuclear@0
|
410 }
|
nuclear@0
|
411
|
nuclear@0
|
412 ////////// pass 2 (Bump & Lightmap) //////////
|
nuclear@0
|
413 if(stage > 0) { // did a first pass
|
nuclear@0
|
414 gc->SetAlphaBlending(true);
|
nuclear@0
|
415 gc->SetBlendFunc(BLEND_DESTCOLOR, BLEND_ZERO); // mult blend
|
nuclear@0
|
416 mat.Emissive = Color(1.0f); // do not recalculate lighting
|
nuclear@0
|
417 }
|
nuclear@0
|
418
|
nuclear@0
|
419 stage = 0;
|
nuclear@0
|
420 if(mat.Maps[LightMap]) {
|
nuclear@0
|
421 gc->SetTexture(stage, mat.Maps[LightMap]);
|
nuclear@0
|
422 gc->SetTextureStageColor(stage, TexBlendSelectArg2, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
423 gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
424 gc->SetTextureCoordIndex(stage, 1);
|
nuclear@0
|
425 stage++;
|
nuclear@0
|
426 }
|
nuclear@0
|
427
|
nuclear@0
|
428 gc->SetTexture(stage, 0);
|
nuclear@0
|
429 gc->DisableTextureStage(stage);
|
nuclear@0
|
430
|
nuclear@0
|
431 if(stage > 0) gc->Draw(vb, ib);
|
nuclear@0
|
432
|
nuclear@0
|
433 gc->SetAlphaBlending(false);
|
nuclear@0
|
434 }
|
nuclear@0
|
435
|
nuclear@0
|
436 if(!rendp.ZWrite) gc->SetZWrite(false);
|
nuclear@0
|
437 }
|
nuclear@0
|
438
|
nuclear@0
|
439
|
nuclear@0
|
440 void Object::Render8TexUnits() {Render4TexUnits();}
|
nuclear@0
|
441
|
nuclear@0
|
442
|
nuclear@0
|
443
|
nuclear@0
|
444 /*
|
nuclear@0
|
445 void Object::Render() {
|
nuclear@0
|
446
|
nuclear@0
|
447 SetRenderStates();
|
nuclear@0
|
448
|
nuclear@0
|
449 VertexBuffer *vb = const_cast<VertexBuffer*>(mesh->GetVertexBuffer());
|
nuclear@0
|
450 IndexBuffer *ib = const_cast<IndexBuffer*>(mesh->GetIndexBuffer());
|
nuclear@0
|
451
|
nuclear@0
|
452 Material mat = material;
|
nuclear@0
|
453 int MapsCount = 0, ActiveTex = 0;
|
nuclear@0
|
454 for(int i=0; i<NumberOfTextureTypes; i++) {
|
nuclear@0
|
455 if(mat.Maps[i]) MapsCount++;
|
nuclear@0
|
456 }
|
nuclear@0
|
457
|
nuclear@0
|
458 if(!MapsCount) {
|
nuclear@0
|
459 gc->SetTexture(0, 0);
|
nuclear@0
|
460 gc->DisableTextureStage(0);
|
nuclear@0
|
461 gc->Draw(vb, ib);
|
nuclear@0
|
462 } else {
|
nuclear@0
|
463 int pass = 1;
|
nuclear@0
|
464 TextureType PassFirstTexture;
|
nuclear@0
|
465 while(MapsCount) {
|
nuclear@0
|
466
|
nuclear@0
|
467 if(mat.Maps[BumpMap]) {
|
nuclear@0
|
468 gc->SetTexture(ActiveTex, mat.Maps[BumpMap]);
|
nuclear@0
|
469 //gc->SetTextureFactor() TODO
|
nuclear@0
|
470 gc->SetTextureStageColor(ActiveTex, TexBlendDotProduct, TexArgFactor, TexArgTexture);
|
nuclear@0
|
471 mat.Maps[BumpMap] = 0;
|
nuclear@0
|
472 if(!ActiveTex) PassFirstTexture = BumpMap;
|
nuclear@0
|
473 } else if(mat.Maps[TextureMap]) {
|
nuclear@0
|
474 gc->SetTexture(ActiveTex, mat.Maps[TextureMap]);
|
nuclear@0
|
475 gc->SetTextureStageColor(ActiveTex, TexBlendModulate, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
476 //gc->SetTextureStageColor(ActiveTex, TexBlendSelectArg2, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
477 gc->SetTextureCoordIndex(ActiveTex, 0);
|
nuclear@0
|
478 mat.Maps[TextureMap] = 0;
|
nuclear@0
|
479 if(!ActiveTex) PassFirstTexture = TextureMap;
|
nuclear@0
|
480 } else if(mat.Maps[DetailMap]) {
|
nuclear@0
|
481 gc->SetTexture(ActiveTex, mat.Maps[DetailMap]);
|
nuclear@0
|
482 gc->SetTextureStageColor(ActiveTex, TexBlendAdd, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
483 gc->SetTextureCoordIndex(ActiveTex, 1);
|
nuclear@0
|
484 mat.Maps[DetailMap] = 0;
|
nuclear@0
|
485 if(!ActiveTex) PassFirstTexture = DetailMap;
|
nuclear@0
|
486 } else if(mat.Maps[EnvironmentMap]) {
|
nuclear@0
|
487 gc->SetTexture(ActiveTex, mat.Maps[EnvironmentMap]);
|
nuclear@0
|
488 gc->SetTextureStageColor(ActiveTex, TexBlendAdd, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
489
|
nuclear@0
|
490 //gc->SetTextureCoordGenerator(TexGenSpherical); TODO
|
nuclear@0
|
491 Matrix4x4 TexMat = Matrix4x4(0.5f, 0.0f, 0.0f, 0.0f,
|
nuclear@0
|
492 0.0f, -0.5f, 0.0f, 0.0f,
|
nuclear@0
|
493 0.0f, 0.0f, 1.0f, 0.0f,
|
nuclear@0
|
494 0.5f, 0.5f, 0.0f, 1.0f );
|
nuclear@0
|
495 gc->SetTextureMatrix(TexMat, ActiveTex);
|
nuclear@0
|
496 gc->D3DDevice->SetTextureStageState(ActiveTex, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
|
nuclear@0
|
497 gc->D3DDevice->SetTextureStageState(ActiveTex, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL);
|
nuclear@0
|
498
|
nuclear@0
|
499 mat.Maps[EnvironmentMap] = 0;
|
nuclear@0
|
500 if(!ActiveTex) PassFirstTexture = EnvironmentMap;
|
nuclear@0
|
501 } else if(mat.Maps[LightMap]) {
|
nuclear@0
|
502 gc->SetTexture(ActiveTex, mat.Maps[LightMap]);
|
nuclear@0
|
503 gc->SetTextureStageColor(ActiveTex, TexBlendModulate, TexArgCurrent, TexArgTexture);
|
nuclear@0
|
504 gc->SetTextureCoordIndex(ActiveTex, 2);
|
nuclear@0
|
505 mat.Maps[LightMap] = 0;
|
nuclear@0
|
506 if(!ActiveTex) PassFirstTexture = LightMap;
|
nuclear@0
|
507 }
|
nuclear@0
|
508
|
nuclear@0
|
509 MapsCount--;
|
nuclear@0
|
510 ActiveTex++;
|
nuclear@0
|
511
|
nuclear@0
|
512 if(!MapsCount) {
|
nuclear@0
|
513 gc->SetTextureStageColor(ActiveTex, TexBlendModulate, TexArgCurrent, TexArgDiffuseColor);
|
nuclear@0
|
514 }
|
nuclear@0
|
515
|
nuclear@0
|
516 if(ActiveTex >= gc->GetTextureStageNumber() || !MapsCount) {
|
nuclear@0
|
517 if(pass++ > 1) {
|
nuclear@0
|
518 gc->SetAlphaBlending(true);
|
nuclear@0
|
519 if(PassFirstTexture == DetailMap || PassFirstTexture == EnvironmentMap) {
|
nuclear@0
|
520 gc->SetBlendFunc(BLEND_ONE, BLEND_ONE);
|
nuclear@0
|
521 } else {
|
nuclear@0
|
522 gc->SetBlendFunc(BLEND_DESTCOLOR, BLEND_ZERO);
|
nuclear@0
|
523 }
|
nuclear@0
|
524 gc->Draw(vb, ib);
|
nuclear@0
|
525 gc->SetAlphaBlending(false);
|
nuclear@0
|
526 } else {
|
nuclear@0
|
527 gc->Draw(vb, ib);
|
nuclear@0
|
528 }
|
nuclear@0
|
529 ActiveTex = 0;
|
nuclear@0
|
530 for(int i=0; i<gc->GetTextureStageNumber(); i++) {
|
nuclear@0
|
531 gc->SetTextureMatrix(Matrix4x4(), i);
|
nuclear@0
|
532 }
|
nuclear@0
|
533 }
|
nuclear@0
|
534 }
|
nuclear@0
|
535 }
|
nuclear@0
|
536
|
nuclear@0
|
537 if(material.SpecularEnable) gc->SetSpecular(false);
|
nuclear@0
|
538 }
|
nuclear@0
|
539 */
|
nuclear@0
|
540
|
nuclear@0
|
541
|
nuclear@0
|
542
|
nuclear@0
|
543 void Object::RenderBare() {
|
nuclear@0
|
544 VertexBuffer *vb = const_cast<VertexBuffer*>(mesh->GetVertexBuffer());
|
nuclear@0
|
545 IndexBuffer *ib = const_cast<IndexBuffer*>(mesh->GetIndexBuffer());
|
nuclear@0
|
546 gc->Draw(vb, ib);
|
nuclear@0
|
547 }
|
nuclear@0
|
548
|
nuclear@0
|
549
|
nuclear@0
|
550 // generate geometry
|
nuclear@0
|
551 void Object::CreatePlane(float size, dword subdivisions) {
|
nuclear@0
|
552 ObjGen::CreatePlane(gc, size, subdivisions, &mesh, mesh->GetLevelCount());
|
nuclear@0
|
553 }
|
nuclear@0
|
554
|
nuclear@0
|
555 void Object::CreateCube(float size) {
|
nuclear@0
|
556 ObjGen::CreateCube(gc, size, &mesh, mesh->GetLevelCount());
|
nuclear@0
|
557 }
|