nuclear@0: #include "dungeonpart.h" nuclear@0: #include "d3dx8.h" nuclear@0: nuclear@0: DungeonPart::DungeonPart(GraphicsContext *gc) { nuclear@0: nuclear@0: this->gc = gc; nuclear@0: nuclear@0: SceneLoader::SetNormalFileSaving(true); nuclear@0: SceneLoader::SetDataPath("data/textures/"); nuclear@0: SceneLoader::LoadScene("data/geometry/scene2.3ds", &scene); nuclear@0: nuclear@0: // setup camera paths nuclear@0: CamPath[0] = scene->GetCurve("cpath01"); nuclear@0: CamPath[1] = scene->GetCurve("cpath02"); nuclear@0: CamPath[2] = scene->GetCurve("cpath03"); nuclear@0: TargPath[0] = scene->GetCurve("ctarget01"); nuclear@0: TargPath[1] = scene->GetCurve("ctarget03"); nuclear@0: nuclear@0: CamPath[0]->SetArcParametrization(true); nuclear@0: CamPath[1]->SetArcParametrization(true); nuclear@0: CamPath[2]->SetArcParametrization(true); nuclear@0: TargPath[0]->SetArcParametrization(true); nuclear@0: TargPath[1]->SetArcParametrization(true); nuclear@0: nuclear@0: nuclear@0: cam[0] = scene->GetCamera("Camera01"); nuclear@0: cam[1] = scene->GetCamera("Camera02"); nuclear@0: cam[2] = scene->GetCamera("Camera03"); nuclear@0: cam[3] = scene->GetCamera("FreeCam"); nuclear@0: nuclear@0: cam[0]->SetCameraPath(CamPath[0], TargPath[0], 0, 40000); nuclear@0: cam[1]->SetCameraPath(CamPath[1], 0, 40000, 45000); nuclear@0: cam[2]->SetCameraPath(CamPath[2], TargPath[1], 45000, 75000); nuclear@0: nuclear@0: // get the lava crust under control nuclear@0: LavaCrust = scene->GetObject("Plane02"); nuclear@0: scene->RemoveObject(LavaCrust); nuclear@0: nuclear@0: // get the shadow-map walls under control nuclear@0: ShadowObj[0] = scene->GetObject("TunnelLigh"); nuclear@0: scene->RemoveObject(ShadowObj[0]); nuclear@0: ShadowObj[1] = scene->GetObject("TunnelLig0"); nuclear@0: scene->RemoveObject(ShadowObj[1]); nuclear@0: nuclear@0: // load the flame textures nuclear@0: for(int i=0; itexman->AddTexture(fname.c_str()); nuclear@0: } nuclear@0: nuclear@0: // get the flame objects and remove them from the scene (to take over the rendering) nuclear@0: for(int i=0; i<16; i++) { nuclear@0: char num[3]; nuclear@0: itoa(i, num, 10); nuclear@0: string name = string("Fire") + (i < 10 ? string("0") : string("")) + string(num); nuclear@0: nuclear@0: Flame[i] = scene->GetObject(name.c_str()); nuclear@0: scene->RemoveObject(Flame[i]); nuclear@0: } nuclear@0: nuclear@0: LightRays = scene->GetObject("LightRays"); nuclear@0: scene->RemoveObject(LightRays); nuclear@0: nuclear@0: Floor[0] = scene->GetObject("floor1"); nuclear@0: Floor[1] = scene->GetObject("floor2"); nuclear@0: Floor[2] = scene->GetObject("floor3"); nuclear@0: for(int i=0; i<3; i++) scene->RemoveObject(Floor[i]); nuclear@0: nuclear@0: Obj = scene->GetObject("DefSphere"); nuclear@0: scene->RemoveObject(Obj); nuclear@0: nuclear@0: mobj = new Object(gc); nuclear@0: mobj->GetTriMesh()->SetData(Obj->GetTriMesh()->GetVertexArray(), Obj->GetTriMesh()->GetTriangleArray(), Obj->GetTriMesh()->GetVertexCount(), Obj->GetTriMesh()->GetTriangleCount()); nuclear@0: nuclear@0: Obj->material.SetTexture(gc->texman->AddTexture("data/textures/rusty01.jpg"), TextureMap); nuclear@0: Obj->material.SetTexture(gc->texman->AddTexture("data/textures/refmap1.jpg"), EnvironmentMap); nuclear@0: nuclear@0: Obj->material.SetAmbient(Color(0.5f)); nuclear@0: Obj->material.SetDiffuse(Color(0.5f)); nuclear@0: Obj->material.SetSpecular(Color(175.0f / 256.0f, 95.0f / 256.0f, 17.0f / 256.0f)); nuclear@0: Obj->material.SetSpecularPower(90.0f); nuclear@0: Obj->material.SpecularEnable = true; nuclear@0: mobj->material = Obj->material; nuclear@0: nuclear@0: Obj->GetTriMesh()->ChangeMode(TriMeshDynamic); nuclear@0: mobj->GetTriMesh()->ChangeMode(TriMeshDynamic); nuclear@0: nuclear@0: Crystals[0] = scene->GetObject("Box114"); nuclear@0: Crystals[1] = scene->GetObject("Box115"); nuclear@0: Crystals[2] = scene->GetObject("Box116"); nuclear@0: Crystals[3] = scene->GetObject("Box117"); nuclear@0: Crystals[4] = scene->GetObject("Box118"); nuclear@0: nuclear@0: for(int i=0; i<5; i++) { nuclear@0: scene->RemoveObject(Crystals[i]); nuclear@0: } nuclear@0: nuclear@0: Name = new Object(gc); nuclear@0: Name->CreatePlane(1.7f, 0); nuclear@0: Name->Scale(1.0f, 0.3f, 1.0f); nuclear@0: nuclear@0: Fade = new Object(gc); nuclear@0: Fade->CreatePlane(3.0f, 0); nuclear@0: Fade->material = Material(0.0f, 0.0f, 0.0f); nuclear@0: nuclear@0: // load name textures nuclear@0: for(int i=0; i<8; i++) { nuclear@0: char fname[] = "data/textures/Absence/abx.jpg"; nuclear@0: fname[24] = '1' + i; nuclear@0: NameTex[i] = gc->texman->AddTexture(fname); nuclear@0: } nuclear@0: nuclear@0: cam[3]->Zoom(-1.0f); nuclear@0: } nuclear@0: nuclear@0: DungeonPart::~DungeonPart() { nuclear@0: delete scene; nuclear@0: } nuclear@0: nuclear@0: #define INRANGE(a, b) (msec >= a && msec < b) nuclear@0: nuclear@0: void DungeonPart::MainLoop() { nuclear@0: dword msec = timer.GetMilliSec(); nuclear@0: float t = (float)msec / 1000.0f; nuclear@0: nuclear@0: // set the active camera nuclear@0: for(int i=0; i<3; i++) { nuclear@0: cam[i]->FollowPath(msec); nuclear@0: } nuclear@0: Vector3 Cam3Pos = cam[3]->GetPosition(); nuclear@0: nuclear@0: if(msec >= 0 && msec < 40000) { nuclear@0: scene->SetActiveCamera(cam[0]); nuclear@0: } nuclear@0: if(msec >= 39990 && msec < 45000) { nuclear@0: scene->SetActiveCamera(cam[1]); nuclear@0: } nuclear@0: if(msec >= 45000 && msec < 75000) { nuclear@0: scene->SetActiveCamera(cam[2]); nuclear@0: } nuclear@0: nuclear@0: if(INRANGE(17000, 18000) || INRANGE(22000, 23000)) { nuclear@0: if(INRANGE(22000, 23000)) { nuclear@0: cam[3]->Rotate(0.0f, t, 0.0f); nuclear@0: } else { nuclear@0: cam[3]->Rotate(0.0f, -t, 0.0f); nuclear@0: } nuclear@0: scene->SetActiveCamera(cam[3]); nuclear@0: } nuclear@0: nuclear@0: gc->Clear(0); nuclear@0: gc->ClearZBufferStencil(1.0f, 0); nuclear@0: nuclear@0: nuclear@0: scene->Render(); nuclear@0: nuclear@0: // Render flames nuclear@0: gc->SetLighting(false); nuclear@0: gc->SetZWrite(false); nuclear@0: int ftexnum = (int)((float)msec / 33.35f) % FLAME_TEXTURES; nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetBackfaceCulling(false); nuclear@0: gc->SetBlendFunc(BLEND_ONE, BLEND_ONE); nuclear@0: gc->SetTextureStageColor(0, TexBlendModulate, TexArgTexture, TexArgCurrent); nuclear@0: gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgTexture, TexArgTexture); nuclear@0: gc->SetMaterial(Flame[0]->material); nuclear@0: gc->SetTexture(1, 0); nuclear@0: for(int i=0; i<16; i++) { nuclear@0: gc->SetTexture(0, FlameTex[ftexnum]); nuclear@0: gc->SetWorldMatrix(Flame[i]->GetWorldTransform()); nuclear@0: Flame[i]->RenderBare(); nuclear@0: } nuclear@0: gc->SetBackfaceCulling(true); nuclear@0: gc->SetAlphaBlending(false); nuclear@0: gc->SetZWrite(true); nuclear@0: gc->SetLighting(true); nuclear@0: nuclear@0: // render the shadow walls nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetBlendFunc(BLEND_DESTCOLOR, BLEND_ZERO); nuclear@0: gc->SetTexture(0, ShadowObj[0]->material.Maps[0]); nuclear@0: gc->SetTextureStageColor(0, TexBlendModulate, TexArgTexture, TexArgDiffuseColor); nuclear@0: gc->SetMaterial(ShadowObj[0]->material); nuclear@0: gc->SetWorldMatrix(ShadowObj[0]->GetWorldTransform()); nuclear@0: ShadowObj[0]->RenderBare(); nuclear@0: gc->SetWorldMatrix(ShadowObj[1]->GetWorldTransform()); nuclear@0: ShadowObj[1]->RenderBare(); nuclear@0: gc->SetAlphaBlending(false); nuclear@0: nuclear@0: // render volumetric light nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetZWrite(false); nuclear@0: nuclear@0: nuclear@0: LightRays->ResetScaling(); nuclear@0: nuclear@0: LightRays->material.Alpha = 0.02f; nuclear@0: LightRays->material.SetEmissive(1.0f, 1.0f, 1.0f); nuclear@0: for(int i=0; i<14; i++) { nuclear@0: LightRays->Scale(0.975f, 1.0f, 0.975f); nuclear@0: LightRays->Render(); nuclear@0: } nuclear@0: gc->SetZWrite(true); nuclear@0: gc->SetAlphaBlending(false); nuclear@0: nuclear@0: nuclear@0: // The Morphing Object nuclear@0: nuclear@0: Obj->GetTriMesh()->SetData(mobj->GetTriMesh()->GetVertexArray(), mobj->GetTriMesh()->GetTriangleArray(), mobj->GetTriMesh()->GetVertexCount(), mobj->GetTriMesh()->GetTriangleCount()); nuclear@0: nuclear@0: dword VertCount = Obj->GetTriMesh()->GetVertexCount(); nuclear@0: Vertex *verts = Obj->GetTriMesh()->GetModVertexArray(); nuclear@0: for(dword i=0; iGetTriMesh()->CalculateNormals(); nuclear@0: Obj->Render(); nuclear@0: nuclear@0: nuclear@0: // make the lava move nuclear@0: Matrix3x3 TexMat; nuclear@0: TexMat.m[2][0] = t/50.0f; nuclear@0: TexMat.m[2][1] = t/70.0f; nuclear@0: gc->SetTextureMatrix(TexMat); nuclear@0: LavaCrust->Render(); nuclear@0: gc->SetTextureMatrix(Matrix4x4()); nuclear@0: nuclear@0: /////// Render the Crystals /////////// nuclear@0: /* nuclear@0: float StartRise = 4;//53.0f; nuclear@0: float EndRise = 8;//57.0f; nuclear@0: float yoffset = -355.0f; nuclear@0: nuclear@0: if(t >= StartRise && t < EndRise) { nuclear@0: for(int i=0; i<5; i++) Crystals[i]->SetTranslation(0.0f, (t - StartRise) / (EndRise - StartRise), 0.0f); nuclear@0: } nuclear@0: */ nuclear@0: gc->SetShadingMode(FlatShading); nuclear@0: for(int i=0; i<5; i++) { nuclear@0: Crystals[i]->Render(); nuclear@0: } nuclear@0: gc->SetShadingMode(GouraudShading); nuclear@0: nuclear@0: nuclear@0: //////////////// render the mirroring marble floor /////////////// nuclear@0: nuclear@0: // burn the stencil baby nuclear@0: gc->SetZWrite(false); nuclear@0: gc->SetColorWrite(false, false, false, false); nuclear@0: gc->SetStencilBuffering(true); nuclear@0: gc->SetStencilFunc(CMP_ALWAYS); nuclear@0: gc->SetStencilOp(SOP_KEEP, SOP_KEEP, SOP_INC); nuclear@0: nuclear@0: for(int i=0; i<3; i++) Floor[i]->Render(); nuclear@0: gc->SetZWrite(true); nuclear@0: gc->SetColorWrite(true, true, true, true); nuclear@0: gc->SetStencilOp(SOP_KEEP, SOP_KEEP, SOP_KEEP); nuclear@0: nuclear@0: // render the rest of the floor normally nuclear@0: Floor[0]->ResetRotation(); nuclear@0: Floor[0]->Rotate(0.0f, t/2.0f, 0.0f); nuclear@0: Floor[1]->ResetRotation(); nuclear@0: Floor[1]->Rotate(0.0f, -t/4.0f, 0.0f); nuclear@0: nuclear@0: for(int i=0; i<3; i++) Floor[i]->Render(); nuclear@0: nuclear@0: // render the reflection where stencil > 0 nuclear@0: gc->SetStencilFunc(CMP_EQUAL); nuclear@0: gc->SetStencilReference(1); nuclear@0: gc->ClearZBuffer(1.0f); nuclear@0: nuclear@0: gc->SetFrontFace(CounterClockwise); nuclear@0: nuclear@0: std::list *objlist = scene->GetObjectsList(); nuclear@0: std::list::iterator iter = objlist->begin(); nuclear@0: while(iter != objlist->end()) { nuclear@0: (*iter)->Scale(1.0f, -1.0f, 1.0f); nuclear@0: float alpha = (*iter)->material.Alpha; nuclear@0: (*iter)->material.Alpha = 0.25f; nuclear@0: (*iter)->Render(); nuclear@0: (*iter)->material.Alpha = alpha; nuclear@0: (*iter++)->Scale(1.0f, -1.0f, 1.0f); nuclear@0: } nuclear@0: nuclear@0: gc->SetFrontFace(Clockwise); nuclear@0: gc->SetStencilBuffering(false); nuclear@0: nuclear@0: if(t < 6.0f) { nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetLighting(false); nuclear@0: gc->SetZBuffering(false); nuclear@0: gc->SetBlendFunc(BLEND_ONE, BLEND_ONE); nuclear@0: gc->SetMaterial(Material(1.0f, 1.0f, 1.0f)); nuclear@0: gc->SetTexture(0, NameTex[(msec >> 6) % 8]); nuclear@0: gc->SetTextureStageColor(0, TexBlendSelectArg1, TexArgTexture, TexArgTexture); nuclear@0: gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgTexture, TexArgTexture); nuclear@0: gc->SetWorldMatrix(Name->GetWorldTransform()); nuclear@0: Matrix4x4 ViewMat; nuclear@0: ViewMat.Translate(0.0f, 0.0f, 1.0f); nuclear@0: gc->SetViewMatrix(ViewMat); nuclear@0: Name->RenderBare(); nuclear@0: gc->SetLighting(true); nuclear@0: nuclear@0: // fade in nuclear@0: Fade->material.Alpha = min(max(0.0f, (2.0f - t)), 1.0f); nuclear@0: Fade->Render(); nuclear@0: nuclear@0: gc->SetZBuffering(true); nuclear@0: gc->SetAlphaBlending(false); nuclear@0: } nuclear@0: nuclear@0: cam[3]->SetPosition(Cam3Pos); nuclear@0: }