absence_thelab

annotate src/3deng/objects.cpp @ 0:1cffe3409164

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 23 Oct 2014 01:46:07 +0300
parents
children
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 }