nuclear@0: #include "objects.h" nuclear@0: #include "3dengine.h" nuclear@0: #include "objectgen.h" nuclear@0: nuclear@0: Object::Object(GraphicsContext *gc, byte DetailLevels) { nuclear@0: this->gc = gc; nuclear@0: nuclear@0: mesh = new TriMesh(DetailLevels, gc); nuclear@0: nuclear@0: SetShadingMode(GouraudShading); nuclear@0: SetVertexProgram(FixedFunction); nuclear@0: SetPixelProgram(0); nuclear@0: rendp.Billboarded = false; nuclear@0: rendp.SourceBlendFactor = BLEND_SRCALPHA; nuclear@0: rendp.DestBlendFactor = BLEND_INVSRCALPHA; nuclear@0: rendp.ZWrite = true; nuclear@0: ShadowCount = 0; nuclear@0: UseTextureMatrix = false; nuclear@0: nuclear@0: ShadowVolumes = 0; nuclear@0: CastShadows = false; nuclear@0: nuclear@0: AutoSetZWrite = true; nuclear@0: } nuclear@0: nuclear@0: Object::~Object() { nuclear@0: delete mesh; nuclear@0: if(rendp.VertexProgram != FixedFunction) gc->DestroyVertexProgram(rendp.VertexProgram); nuclear@0: } nuclear@0: nuclear@0: TriMesh *Object::GetTriMesh() { nuclear@0: return mesh; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: // Reset Transformation Matrices nuclear@0: void Object::ResetTransform() { nuclear@0: TransMat.ResetIdentity(); nuclear@0: RotMat.ResetIdentity(); nuclear@0: GRotMat.ResetIdentity(); nuclear@0: ScaleMat.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void Object::ResetTranslation() { nuclear@0: TransMat.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void Object::ResetRotation() { nuclear@0: RotMat.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void Object::ResetGlobalRotation() { nuclear@0: GRotMat.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void Object::ResetScaling() { nuclear@0: ScaleMat.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: // Concatenate additional transformations nuclear@0: void Object::Translate(float tx, float ty, float tz) { nuclear@0: TransMat.Translate(tx, ty, tz); nuclear@0: } nuclear@0: nuclear@0: void Object::Rotate(float rx, float ry, float rz) { nuclear@0: RotMat.Rotate(rx, ry, rz); nuclear@0: } nuclear@0: nuclear@0: void Object::Rotate(const Vector3 &axis, float angle) { nuclear@0: RotMat.Rotate(axis, angle); nuclear@0: } nuclear@0: nuclear@0: void Object::Rotate(const Matrix4x4 &rot) { nuclear@0: RotMat *= rot; nuclear@0: } nuclear@0: nuclear@0: void Object::GlobalRotate(float rx, float ry, float rz) { nuclear@0: GRotMat.Rotate(rx, ry, rz); nuclear@0: } nuclear@0: nuclear@0: void Object::GlobalRotate(const Vector3 &axis, float angle) { nuclear@0: GRotMat.Rotate(axis, angle); nuclear@0: } nuclear@0: nuclear@0: void Object::GlobalRotate(const Matrix4x4 &rot) { nuclear@0: GRotMat *= rot; nuclear@0: } nuclear@0: nuclear@0: void Object::Scale(float sx, float sy, float sz) { nuclear@0: ScaleMat.Scale(sx, sy, sz); nuclear@0: } nuclear@0: nuclear@0: void Object::SetTranslation(float tx, float ty, float tz) { nuclear@0: TransMat.SetTranslation(tx, ty, tz); nuclear@0: } nuclear@0: nuclear@0: void Object::SetRotation(float rx, float ry, float rz) { nuclear@0: RotMat.Rotate(rx, ry, rz); nuclear@0: } nuclear@0: nuclear@0: void Object::SetRotation(const Vector3 &axis, float angle) { nuclear@0: RotMat.Rotate(axis, angle); nuclear@0: } nuclear@0: nuclear@0: void Object::SetRotation(const Matrix4x4 &rot) { nuclear@0: RotMat = rot; nuclear@0: } nuclear@0: nuclear@0: void Object::SetGlobalRotation(float rx, float ry, float rz) { nuclear@0: GRotMat.Rotate(rx, ry, rz); nuclear@0: } nuclear@0: nuclear@0: void Object::SetGlobalRotation(const Vector3 &axis, float angle) { nuclear@0: GRotMat.Rotate(axis, angle); nuclear@0: } nuclear@0: nuclear@0: void Object::SetGlobalRotation(const Matrix4x4 &rot) { nuclear@0: GRotMat = rot; nuclear@0: } nuclear@0: nuclear@0: void Object::SetScaling(float sx, float sy, float sz) { nuclear@0: ScaleMat.Scale(sx, sy, sz); nuclear@0: } nuclear@0: nuclear@0: const Matrix4x4 Object::GetWorldTransform() const { nuclear@0: return ScaleMat * RotMat * TransMat * GRotMat; nuclear@0: } nuclear@0: nuclear@0: void Object::SetTextureMatrix(Matrix4x4 mat) { nuclear@0: UseTextureMatrix = true; nuclear@0: TextureMatrix = mat; nuclear@0: } nuclear@0: nuclear@0: Matrix4x4 Object::GetTextureMatrix() const { nuclear@0: return TextureMatrix; nuclear@0: } nuclear@0: nuclear@0: void Object::SetVertexProgram(dword VertexProgram) { nuclear@0: rendp.VertexProgram = VertexProgram; nuclear@0: } nuclear@0: nuclear@0: void Object::SetPixelProgram(dword PixelProgram) { nuclear@0: rendp.PixelProgram = PixelProgram; nuclear@0: } nuclear@0: nuclear@0: void Object::SetShadingMode(ShadeMode smode) { nuclear@0: rendp.Shading = smode; nuclear@0: } nuclear@0: nuclear@0: void Object::SetWriteZBuffer(bool enable) { nuclear@0: rendp.ZWrite = enable; nuclear@0: AutoSetZWrite = false; nuclear@0: } nuclear@0: nuclear@0: void Object::SetBlendFunc(BlendingFactor src, BlendingFactor dest) { nuclear@0: rendp.SourceBlendFactor = src; nuclear@0: rendp.DestBlendFactor = dest; nuclear@0: } nuclear@0: nuclear@0: void Object::GetBlendFunc(BlendingFactor *src, BlendingFactor *dest) { nuclear@0: *src = rendp.SourceBlendFactor; nuclear@0: *dest = rendp.DestBlendFactor; nuclear@0: } nuclear@0: nuclear@0: void Object::CalculateShadows(const Light **lights, int LightCount) { nuclear@0: if(ShadowVolumes) { nuclear@0: for(int i=0; i= ShadowCount) return 0; nuclear@0: return ShadowVolumes[light]; nuclear@0: } nuclear@0: nuclear@0: void Object::SetShadowCasting(bool enable) { nuclear@0: CastShadows = enable; nuclear@0: } nuclear@0: nuclear@0: bool Object::GetShadowCasting() const { nuclear@0: return CastShadows; nuclear@0: } nuclear@0: nuclear@0: /////////////////////////// nuclear@0: nuclear@0: void Object::SetRenderStates() { nuclear@0: gc->SetWorldMatrix(GetWorldTransform()); nuclear@0: nuclear@0: gc->SetMaterial(material); nuclear@0: if(AutoSetZWrite && material.Alpha < 0.991f) rendp.ZWrite = false; nuclear@0: gc->SetSpecular(material.SpecularEnable); nuclear@0: nuclear@0: gc->SetVertexProgram(rendp.VertexProgram); nuclear@0: gc->SetPixelProgram(rendp.PixelProgram); nuclear@0: gc->SetShadingMode(rendp.Shading); nuclear@0: } nuclear@0: nuclear@0: void Object::Render() { nuclear@0: int TexUnits = gc->GetTextureStageNumber(); nuclear@0: nuclear@0: if(TexUnits < 4) { nuclear@0: Render2TexUnits(); nuclear@0: } else if(TexUnits < 8) { nuclear@0: Render4TexUnits(); nuclear@0: } else { nuclear@0: Render8TexUnits(); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void Object::Render2TexUnits() { nuclear@0: nuclear@0: SetRenderStates(); nuclear@0: nuclear@0: VertexBuffer *vb = const_cast(mesh->GetVertexBuffer()); nuclear@0: IndexBuffer *ib = const_cast(mesh->GetIndexBuffer()); nuclear@0: nuclear@0: Material mat = material; nuclear@0: nuclear@0: int TexCount = 0; nuclear@0: for(int i=0; iSetZWrite(false); nuclear@0: nuclear@0: if(!TexCount) { nuclear@0: // render without any texture nuclear@0: gc->SetTexture(0, 0); nuclear@0: gc->SetTextureStageColor(0, TexBlendSelectArg1, TexArgDiffuseColor, TexArgTexture); nuclear@0: if(mat.Alpha < 1.0f) { nuclear@0: gc->SetTextureFactor(Color(mat.Alpha, mat.Alpha, mat.Alpha, mat.Alpha).GetPacked32()); nuclear@0: gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgFactor, TexArgDiffuseColor); nuclear@0: } else { nuclear@0: gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgCurrent, TexArgTexture); nuclear@0: } nuclear@0: gc->DisableTextureStage(1); nuclear@0: nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetBlendFunc(rendp.SourceBlendFactor, rendp.DestBlendFactor); nuclear@0: gc->Draw(vb, ib); nuclear@0: gc->SetAlphaBlending(false); nuclear@0: } else { nuclear@0: nuclear@0: ////////// pass 1 (texture & env) /////////// nuclear@0: int stage = 0; nuclear@0: if(mat.Maps[TextureMap]) { nuclear@0: if(UseTextureMatrix) gc->SetTextureMatrix(TextureMatrix, 0); nuclear@0: gc->SetTexture(stage, mat.Maps[TextureMap]); nuclear@0: gc->SetTextureStageColor(stage, TexBlendModulate, TexArgCurrent, TexArgTexture); nuclear@0: if(mat.Alpha < 1.0f) { nuclear@0: gc->SetTextureFactor(Color(mat.Alpha, mat.Alpha, mat.Alpha, mat.Alpha).GetPacked32()); nuclear@0: gc->SetTextureStageAlpha(stage, TexBlendModulate, TexArgTexture, TexArgFactor); nuclear@0: } else { nuclear@0: gc->SetTextureStageAlpha(stage, TexBlendSelectArg2, TexArgCurrent, TexArgTexture); nuclear@0: } nuclear@0: gc->SetTextureCoordIndex(stage, 0); nuclear@0: stage++; nuclear@0: } nuclear@0: nuclear@0: if(mat.Maps[EnvironmentMap]) { nuclear@0: gc->SetTexture(stage, mat.Maps[EnvironmentMap]); nuclear@0: gc->SetTextureStageColor(stage, TexBlendAdd, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture); nuclear@0: 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: gc->SetTextureMatrix(TexMat, stage); nuclear@0: gc->D3DDevice->SetTextureStageState(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); nuclear@0: gc->D3DDevice->SetTextureStageState(stage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL); nuclear@0: stage++; nuclear@0: } nuclear@0: nuclear@0: gc->SetTexture(stage, 0); nuclear@0: gc->DisableTextureStage(stage); nuclear@0: nuclear@0: if(stage > 0) { nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetBlendFunc(rendp.SourceBlendFactor, rendp.DestBlendFactor); nuclear@0: gc->Draw(vb, ib); nuclear@0: gc->SetAlphaBlending(false); nuclear@0: nuclear@0: gc->SetTextureMatrix(Matrix4x4(), 0); nuclear@0: gc->SetTextureMatrix(Matrix4x4(), 1); nuclear@0: } nuclear@0: nuclear@0: ////////// pass 2 (Bump & Lightmap) ////////// nuclear@0: if(stage > 0) { // did a first pass nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetBlendFunc(BLEND_DESTCOLOR, BLEND_ZERO); // mult blend nuclear@0: mat.Emissive = Color(1.0f); // do not recalculate lighting nuclear@0: } nuclear@0: nuclear@0: stage = 0; nuclear@0: if(mat.Maps[LightMap]) { nuclear@0: gc->SetTexture(stage, mat.Maps[LightMap]); nuclear@0: gc->SetTextureStageColor(stage, TexBlendSelectArg2, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureCoordIndex(stage, 1); nuclear@0: stage++; nuclear@0: } nuclear@0: nuclear@0: if(mat.Maps[BumpMap]) { nuclear@0: // re-implementation due nuclear@0: } nuclear@0: nuclear@0: gc->SetTexture(stage, 0); nuclear@0: gc->DisableTextureStage(stage); nuclear@0: nuclear@0: if(stage > 0) gc->Draw(vb, ib); nuclear@0: nuclear@0: gc->SetAlphaBlending(false); nuclear@0: } nuclear@0: nuclear@0: if(!rendp.ZWrite) gc->SetZWrite(true); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void Object::Render4TexUnits() { nuclear@0: SetRenderStates(); nuclear@0: nuclear@0: VertexBuffer *vb = const_cast(mesh->GetVertexBuffer()); nuclear@0: IndexBuffer *ib = const_cast(mesh->GetIndexBuffer()); nuclear@0: nuclear@0: Material mat = material; nuclear@0: nuclear@0: int TexCount = 0; nuclear@0: for(int i=0; iSetZWrite(false); nuclear@0: nuclear@0: if(!TexCount) { nuclear@0: // render without any texture nuclear@0: gc->SetTexture(0, 0); nuclear@0: gc->SetTextureStageColor(0, TexBlendSelectArg1, TexArgDiffuseColor, TexArgTexture); nuclear@0: if(mat.Alpha < 1.0f) { nuclear@0: gc->SetTextureFactor(Color(mat.Alpha, mat.Alpha, mat.Alpha, mat.Alpha).GetPacked32()); nuclear@0: gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgFactor, TexArgDiffuseColor); nuclear@0: } else { nuclear@0: gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgCurrent, TexArgTexture); nuclear@0: } nuclear@0: gc->DisableTextureStage(1); nuclear@0: nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetBlendFunc(rendp.SourceBlendFactor, rendp.DestBlendFactor); nuclear@0: gc->Draw(vb, ib); nuclear@0: gc->SetAlphaBlending(false); nuclear@0: } else { nuclear@0: nuclear@0: ////////// pass 1 (texture, detail, env, bump) /////////// nuclear@0: int stage = 0; nuclear@0: if(mat.Maps[TextureMap]) { nuclear@0: if(UseTextureMatrix) gc->SetTextureMatrix(TextureMatrix, 0); nuclear@0: gc->SetTexture(stage, mat.Maps[TextureMap]); nuclear@0: gc->SetTextureStageColor(stage, TexBlendModulate, TexArgCurrent, TexArgTexture); nuclear@0: if(mat.Alpha < 1.0f) { nuclear@0: gc->SetTextureFactor(Color(mat.Alpha, mat.Alpha, mat.Alpha, mat.Alpha).GetPacked32()); nuclear@0: gc->SetTextureStageAlpha(stage, TexBlendModulate, TexArgTexture, TexArgFactor); nuclear@0: } else { nuclear@0: gc->SetTextureStageAlpha(stage, TexBlendSelectArg2, TexArgCurrent, TexArgTexture); nuclear@0: } nuclear@0: gc->SetTextureCoordIndex(stage, 0); nuclear@0: stage++; nuclear@0: } nuclear@0: nuclear@0: if(mat.Maps[DetailMap]) { nuclear@0: gc->SetTexture(stage, mat.Maps[DetailMap]); nuclear@0: gc->SetTextureStageColor(stage, TexBlendAdd, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureCoordIndex(stage, 1); nuclear@0: stage++; nuclear@0: } nuclear@0: nuclear@0: if(mat.Maps[EnvironmentMap]) { nuclear@0: gc->SetTexture(stage, mat.Maps[EnvironmentMap]); nuclear@0: gc->SetTextureStageColor(stage, TexBlendAdd, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture); nuclear@0: 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: gc->SetTextureMatrix(TexMat, stage); nuclear@0: gc->D3DDevice->SetTextureStageState(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); nuclear@0: gc->D3DDevice->SetTextureStageState(stage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL); nuclear@0: stage++; nuclear@0: } nuclear@0: nuclear@0: if(mat.Maps[BumpMap]) { nuclear@0: // re-implementation due nuclear@0: } nuclear@0: nuclear@0: gc->SetTexture(stage, 0); nuclear@0: gc->DisableTextureStage(stage); nuclear@0: nuclear@0: if(stage > 0) { nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetBlendFunc(rendp.SourceBlendFactor, rendp.DestBlendFactor); nuclear@0: gc->Draw(vb, ib); nuclear@0: gc->SetAlphaBlending(false); nuclear@0: nuclear@0: gc->SetTextureMatrix(Matrix4x4(), 0); nuclear@0: gc->SetTextureMatrix(Matrix4x4(), 1); nuclear@0: gc->SetTextureMatrix(Matrix4x4(), 2); nuclear@0: } nuclear@0: nuclear@0: ////////// pass 2 (Bump & Lightmap) ////////// nuclear@0: if(stage > 0) { // did a first pass nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetBlendFunc(BLEND_DESTCOLOR, BLEND_ZERO); // mult blend nuclear@0: mat.Emissive = Color(1.0f); // do not recalculate lighting nuclear@0: } nuclear@0: nuclear@0: stage = 0; nuclear@0: if(mat.Maps[LightMap]) { nuclear@0: gc->SetTexture(stage, mat.Maps[LightMap]); nuclear@0: gc->SetTextureStageColor(stage, TexBlendSelectArg2, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureStageAlpha(stage, TexBlendSelectArg1, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureCoordIndex(stage, 1); nuclear@0: stage++; nuclear@0: } nuclear@0: nuclear@0: gc->SetTexture(stage, 0); nuclear@0: gc->DisableTextureStage(stage); nuclear@0: nuclear@0: if(stage > 0) gc->Draw(vb, ib); nuclear@0: nuclear@0: gc->SetAlphaBlending(false); nuclear@0: } nuclear@0: nuclear@0: if(!rendp.ZWrite) gc->SetZWrite(false); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void Object::Render8TexUnits() {Render4TexUnits();} nuclear@0: nuclear@0: nuclear@0: nuclear@0: /* nuclear@0: void Object::Render() { nuclear@0: nuclear@0: SetRenderStates(); nuclear@0: nuclear@0: VertexBuffer *vb = const_cast(mesh->GetVertexBuffer()); nuclear@0: IndexBuffer *ib = const_cast(mesh->GetIndexBuffer()); nuclear@0: nuclear@0: Material mat = material; nuclear@0: int MapsCount = 0, ActiveTex = 0; nuclear@0: for(int i=0; iSetTexture(0, 0); nuclear@0: gc->DisableTextureStage(0); nuclear@0: gc->Draw(vb, ib); nuclear@0: } else { nuclear@0: int pass = 1; nuclear@0: TextureType PassFirstTexture; nuclear@0: while(MapsCount) { nuclear@0: nuclear@0: if(mat.Maps[BumpMap]) { nuclear@0: gc->SetTexture(ActiveTex, mat.Maps[BumpMap]); nuclear@0: //gc->SetTextureFactor() TODO nuclear@0: gc->SetTextureStageColor(ActiveTex, TexBlendDotProduct, TexArgFactor, TexArgTexture); nuclear@0: mat.Maps[BumpMap] = 0; nuclear@0: if(!ActiveTex) PassFirstTexture = BumpMap; nuclear@0: } else if(mat.Maps[TextureMap]) { nuclear@0: gc->SetTexture(ActiveTex, mat.Maps[TextureMap]); nuclear@0: gc->SetTextureStageColor(ActiveTex, TexBlendModulate, TexArgCurrent, TexArgTexture); nuclear@0: //gc->SetTextureStageColor(ActiveTex, TexBlendSelectArg2, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureCoordIndex(ActiveTex, 0); nuclear@0: mat.Maps[TextureMap] = 0; nuclear@0: if(!ActiveTex) PassFirstTexture = TextureMap; nuclear@0: } else if(mat.Maps[DetailMap]) { nuclear@0: gc->SetTexture(ActiveTex, mat.Maps[DetailMap]); nuclear@0: gc->SetTextureStageColor(ActiveTex, TexBlendAdd, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureCoordIndex(ActiveTex, 1); nuclear@0: mat.Maps[DetailMap] = 0; nuclear@0: if(!ActiveTex) PassFirstTexture = DetailMap; nuclear@0: } else if(mat.Maps[EnvironmentMap]) { nuclear@0: gc->SetTexture(ActiveTex, mat.Maps[EnvironmentMap]); nuclear@0: gc->SetTextureStageColor(ActiveTex, TexBlendAdd, TexArgCurrent, TexArgTexture); nuclear@0: nuclear@0: //gc->SetTextureCoordGenerator(TexGenSpherical); TODO nuclear@0: Matrix4x4 TexMat = Matrix4x4(0.5f, 0.0f, 0.0f, 0.0f, nuclear@0: 0.0f, -0.5f, 0.0f, 0.0f, nuclear@0: 0.0f, 0.0f, 1.0f, 0.0f, nuclear@0: 0.5f, 0.5f, 0.0f, 1.0f ); nuclear@0: gc->SetTextureMatrix(TexMat, ActiveTex); nuclear@0: gc->D3DDevice->SetTextureStageState(ActiveTex, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); nuclear@0: gc->D3DDevice->SetTextureStageState(ActiveTex, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL); nuclear@0: nuclear@0: mat.Maps[EnvironmentMap] = 0; nuclear@0: if(!ActiveTex) PassFirstTexture = EnvironmentMap; nuclear@0: } else if(mat.Maps[LightMap]) { nuclear@0: gc->SetTexture(ActiveTex, mat.Maps[LightMap]); nuclear@0: gc->SetTextureStageColor(ActiveTex, TexBlendModulate, TexArgCurrent, TexArgTexture); nuclear@0: gc->SetTextureCoordIndex(ActiveTex, 2); nuclear@0: mat.Maps[LightMap] = 0; nuclear@0: if(!ActiveTex) PassFirstTexture = LightMap; nuclear@0: } nuclear@0: nuclear@0: MapsCount--; nuclear@0: ActiveTex++; nuclear@0: nuclear@0: if(!MapsCount) { nuclear@0: gc->SetTextureStageColor(ActiveTex, TexBlendModulate, TexArgCurrent, TexArgDiffuseColor); nuclear@0: } nuclear@0: nuclear@0: if(ActiveTex >= gc->GetTextureStageNumber() || !MapsCount) { nuclear@0: if(pass++ > 1) { nuclear@0: gc->SetAlphaBlending(true); nuclear@0: if(PassFirstTexture == DetailMap || PassFirstTexture == EnvironmentMap) { nuclear@0: gc->SetBlendFunc(BLEND_ONE, BLEND_ONE); nuclear@0: } else { nuclear@0: gc->SetBlendFunc(BLEND_DESTCOLOR, BLEND_ZERO); nuclear@0: } nuclear@0: gc->Draw(vb, ib); nuclear@0: gc->SetAlphaBlending(false); nuclear@0: } else { nuclear@0: gc->Draw(vb, ib); nuclear@0: } nuclear@0: ActiveTex = 0; nuclear@0: for(int i=0; iGetTextureStageNumber(); i++) { nuclear@0: gc->SetTextureMatrix(Matrix4x4(), i); nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: if(material.SpecularEnable) gc->SetSpecular(false); nuclear@0: } nuclear@0: */ nuclear@0: nuclear@0: nuclear@0: nuclear@0: void Object::RenderBare() { nuclear@0: VertexBuffer *vb = const_cast(mesh->GetVertexBuffer()); nuclear@0: IndexBuffer *ib = const_cast(mesh->GetIndexBuffer()); nuclear@0: gc->Draw(vb, ib); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: // generate geometry nuclear@0: void Object::CreatePlane(float size, dword subdivisions) { nuclear@0: ObjGen::CreatePlane(gc, size, subdivisions, &mesh, mesh->GetLevelCount()); nuclear@0: } nuclear@0: nuclear@0: void Object::CreateCube(float size) { nuclear@0: ObjGen::CreateCube(gc, size, &mesh, mesh->GetLevelCount()); nuclear@0: }