nuclear@0: #include "treepart.h" nuclear@0: nuclear@0: TreePart::TreePart(GraphicsContext *gc) { nuclear@0: this->gc = gc; nuclear@0: nuclear@0: scene = new Scene(gc); nuclear@0: /* nuclear@0: LeavesParticle = gc->texman->AddTexture("data/textures/leaf.png"); nuclear@0: nuclear@0: leaves = new ParticleSystem(gc); nuclear@0: leaves->SetPosition(Vector3(0.0f, 800.0f, 0.0f)); nuclear@0: leaves->SetGravitualForce(0.8f); nuclear@0: leaves->SetFriction(0.05f); nuclear@0: leaves->SetInitialColor(0.6f, 0.5f, 0.5f); nuclear@0: leaves->SetDeathColor(0.6f, 0.5f, 0.5f); nuclear@0: leaves->SetParticleSize(6.0f); nuclear@0: leaves->SetParticleLife(1000); nuclear@0: leaves->SetSpawnRadius(1500.0f); nuclear@0: leaves->SetSpawnRate(20.0f); nuclear@0: leaves->SetTexture(LeavesParticle); nuclear@0: leaves->SetShootDirection(Vector3(0.0f, -10.0f, 0.0f)); nuclear@0: leaves->SetMaxDispersionAngle(QuarterPi / 2.0f); nuclear@0: leaves->SetBlendingMode(BLEND_SRCALPHA, BLEND_INVSRCALPHA); nuclear@0: */ nuclear@0: WispParticle = gc->texman->AddTexture("data/textures/psys02.jpg"); nuclear@0: nuclear@0: for(int i=0; i<4; i++) { nuclear@0: WispParticles[i] = new ParticleSystem(gc); nuclear@0: WispParticles[i]->SetGravitualForce(0.8f); nuclear@0: WispParticles[i]->SetFriction(0.06f); nuclear@0: WispParticles[i]->SetInitialColor(0.7f, 0.8f, 1.0f); nuclear@0: WispParticles[i]->SetDeathColor(0.2f, 0.2f, 0.5f); nuclear@0: WispParticles[i]->SetParticleSize(7.5f); nuclear@0: WispParticles[i]->SetParticleLife(15); nuclear@0: WispParticles[i]->SetSpawnRadius(0.2f); nuclear@0: WispParticles[i]->SetSpawnRate(4.0f); nuclear@0: WispParticles[i]->SetTexture(WispParticle); nuclear@0: WispParticles[i]->SetShootDirection(Vector3(0.0f, 0.0f, 0.0f)); nuclear@0: WispParticles[i]->SetMaxDispersionAngle(QuarterPi / 2.0f); nuclear@0: WispParticles[i]->SetBlendingMode(BLEND_ONE, BLEND_ONE); nuclear@0: WispParticles[i]->SetSpawningDifferenceDispersion(1.0f); nuclear@0: } nuclear@0: nuclear@0: SceneLoader::SetNormalFileSaving(true); nuclear@0: SceneLoader::SetDataPath("data/textures/"); nuclear@0: SceneLoader::LoadScene("data/geometry/tree2.3ds", &scene); nuclear@0: nuclear@0: Trees = scene->GetObject("Trees"); nuclear@0: scene->RemoveObject(Trees); nuclear@0: nuclear@0: for(int i=0; i<3; i++) { nuclear@0: dummy[i] = new Camera; nuclear@0: } nuclear@0: nuclear@0: Object *graves = scene->GetObject("Graves"); nuclear@0: //graves->SetShadowCasting(true); nuclear@0: nuclear@0: WispPath[0] = scene->GetCurve("wisp1"); nuclear@0: WispPath[1] = scene->GetCurve("wisp2"); nuclear@0: WispPath[2] = scene->GetCurve("wisp3"); nuclear@0: nuclear@0: WispPath[0]->SetArcParametrization(true); nuclear@0: WispPath[1]->SetArcParametrization(true); nuclear@0: WispPath[2]->SetArcParametrization(true); nuclear@0: nuclear@0: dummy[0]->SetCameraPath(WispPath[0], 0, 0, 8000); nuclear@0: dummy[1]->SetCameraPath(WispPath[1], 0, 0, 7000); nuclear@0: dummy[2]->SetCameraPath(WispPath[2], 0, 0, 10000); nuclear@0: nuclear@0: lights[0] = scene->GetLight("wispl1"); nuclear@0: lights[1] = scene->GetLight("wispl2"); nuclear@0: lights[2] = scene->GetLight("wispl3"); nuclear@0: lights[3] = scene->GetLight("wispl04"); nuclear@0: nuclear@0: for(int i=0; i<3; i++) { nuclear@0: lights[i]->SetRange(250.0f); nuclear@0: lights[i]->SetColor(Color(0.6f, 0.6f, 0.9f)); nuclear@0: } nuclear@0: lights[3]->SetColor(Color(0.6f, 0.6f, 0.9f)); nuclear@0: nuclear@0: CamPath = scene->GetCurve("cpath01"); nuclear@0: TargPath = scene->GetCurve("ctarget01"); nuclear@0: nuclear@0: CamPath->SetArcParametrization(true); nuclear@0: TargPath->SetArcParametrization(true); nuclear@0: nuclear@0: cam = scene->GetCamera("Camera02"); nuclear@0: cam->SetClippingPlanes(1.0f, 80000.0f); nuclear@0: cam->SetCameraPath(CamPath, TargPath, 0, 40000); nuclear@0: scene->SetActiveCamera(cam); nuclear@0: nuclear@0: //scene->SetShadows(true); nuclear@0: //lights[3]->SetShadowCasting(true); nuclear@0: nuclear@0: Moon = scene->GetObject("Moon"); nuclear@0: scene->RemoveObject(Moon); nuclear@0: nuclear@0: Stars = scene->GetObject("StarDome"); nuclear@0: scene->RemoveObject(Stars); nuclear@0: nuclear@0: } nuclear@0: nuclear@0: TreePart::~TreePart() { nuclear@0: delete scene; nuclear@0: delete leaves; nuclear@0: } nuclear@0: nuclear@0: void TreePart::MainLoop() { nuclear@0: dword msec = timer.GetMilliSec(); nuclear@0: float t = msec / 1000.0f; nuclear@0: nuclear@0: float start = 10.0f; nuclear@0: float end = 10500.0f; nuclear@0: nuclear@0: gc->D3DDevice->SetRenderState(D3DRS_FOGENABLE, true); nuclear@0: gc->D3DDevice->SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR); nuclear@0: gc->D3DDevice->SetRenderState(D3DRS_FOGCOLOR, 0); nuclear@0: gc->D3DDevice->SetRenderState(D3DRS_FOGSTART, *(dword*)(&start)); nuclear@0: gc->D3DDevice->SetRenderState(D3DRS_FOGEND, *(dword*)(&end)); nuclear@0: nuclear@0: cam->FollowPath(msec); nuclear@0: for(int i=0; i<3; i++) { nuclear@0: dummy[i]->FollowPath(msec, true); nuclear@0: lights[i]->SetPosition(dummy[i]->GetPosition()); nuclear@0: } nuclear@0: lights[3]->SetPosition(cam->GetTargetPosition()); nuclear@0: nuclear@0: gc->Clear(0); nuclear@0: gc->ClearZBufferStencil(1.0f, 0); nuclear@0: nuclear@0: scene->Render(); nuclear@0: nuclear@0: gc->SetZWrite(false); nuclear@0: Trees->Render(); nuclear@0: gc->SetZWrite(true); nuclear@0: nuclear@0: //for(int i=0; i<3; i++) { nuclear@0: // lights[i]->Draw(gc, 20.0f); nuclear@0: //} nuclear@0: //lights[3]->Draw(gc, 30.0f); nuclear@0: nuclear@0: gc->D3DDevice->SetRenderState(D3DRS_FOGENABLE, false); nuclear@0: nuclear@0: //leaves->Update(t); nuclear@0: //leaves->Render(); nuclear@0: nuclear@0: Stars->Render(); nuclear@0: Moon->Render(); nuclear@0: nuclear@0: for(int i=0; i<4; i++) { nuclear@0: WispParticles[i]->SetPosition(Vector3(lights[i]->GetPosition())); nuclear@0: WispParticles[i]->Update(t); nuclear@0: WispParticles[i]->Render(); nuclear@0: } nuclear@0: } nuclear@0: