absence_thelab

diff src/hellpart.cpp @ 0:1cffe3409164

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 23 Oct 2014 01:46:07 +0300
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/hellpart.cpp	Thu Oct 23 01:46:07 2014 +0300
     1.3 @@ -0,0 +1,225 @@
     1.4 +#include <cassert>
     1.5 +#include "hellpart.h"
     1.6 +
     1.7 +HellPart::HellPart(GraphicsContext *gc) {
     1.8 +	this->gc = gc;
     1.9 +
    1.10 +	SceneLoader::SetNormalFileSaving(true);
    1.11 +	SceneLoader::SetDataPath("data/textures/");
    1.12 +	SceneLoader::LoadScene("data/geometry/hell.3ds", &scene);
    1.13 +
    1.14 +	CamPath = scene->GetCurve("CamPath");
    1.15 +	cam = const_cast<Camera*>(scene->GetActiveCamera());
    1.16 +	cam->SetCameraPath(CamPath, 0, 0, 30000);
    1.17 +	cam->SetClippingPlanes(1.0f, 100000.0f);
    1.18 +
    1.19 +	cam2 = scene->GetCamera("Camera02");
    1.20 +	cam3 = scene->GetCamera("Camera03");
    1.21 +	cam2->SetClippingPlanes(1.0f, 100000.0f);
    1.22 +	cam3->SetClippingPlanes(1.0f, 100000.0f);
    1.23 +
    1.24 +	Thunder = scene->GetLight("Omni01");
    1.25 +	Thunder->SetIntensity(0.0f);
    1.26 +
    1.27 +	ThundEnv[0] = scene->GetObject("b1");
    1.28 +	ThundEnv[1] = scene->GetObject("b2");
    1.29 +	ThundEnv[2] = scene->GetObject("b3");
    1.30 +	ThundEnv[3] = scene->GetObject("b4");
    1.31 +	ThundEnv[4] = scene->GetObject("b5");
    1.32 +	for(int i=0; i<5; i++) {
    1.33 +		scene->RemoveObject(ThundEnv[i]);
    1.34 +	}
    1.35 +
    1.36 +	Stones[0] = scene->GetObject("Box01");
    1.37 +	Stones[1] = scene->GetObject("Box02");
    1.38 +	Stones[2] = scene->GetObject("Box03");
    1.39 +	Stones[3] = scene->GetObject("Box04");
    1.40 +	Stones[4] = scene->GetObject("Box05");
    1.41 +	for(int i=0; i<5; i++) {
    1.42 +		scene->RemoveObject(Stones[i]);
    1.43 +		Stones[i]->SetShadingMode(FlatShading);
    1.44 +	}
    1.45 +
    1.46 +	Rings[0] = scene->GetObject("Tube01");
    1.47 +	Rings[1] = scene->GetObject("Tube02");
    1.48 +	Rings[2] = scene->GetObject("Tube03");
    1.49 +	Rings[3] = scene->GetObject("Tube04");
    1.50 +	Rings[4] = scene->GetObject("Tube05");
    1.51 +	for(int i=0; i<5; i++) {
    1.52 +		scene->RemoveObject(Rings[i]);
    1.53 +	}
    1.54 +
    1.55 +	// Load Credits
    1.56 +	dbgtex = gc->texman->AddTexture("data/textures/psys02.jpg");
    1.57 +	CredNuc[0] = gc->texman->AddTexture("data/textures/credits/nuc1.jpg");
    1.58 +	CredNuc[1] = gc->texman->AddTexture("data/textures/credits/nuc2.jpg");
    1.59 +	CredNuc[2] = gc->texman->AddTexture("data/textures/credits/nuc3.jpg");
    1.60 +	CredNuc[3] = gc->texman->AddTexture("data/textures/credits/nuc4.jpg");
    1.61 +	CredNuc[4] = gc->texman->AddTexture("data/textures/credits/nuc5.jpg");
    1.62 +	CredNuc[5] = gc->texman->AddTexture("data/textures/credits/nuc6.jpg");
    1.63 +	CredNuc[6] = gc->texman->AddTexture("data/textures/credits/nuc7.jpg");
    1.64 +
    1.65 +	CredRaw[0] = gc->texman->AddTexture("data/textures/credits/raw1.jpg");
    1.66 +	CredRaw[1] = gc->texman->AddTexture("data/textures/credits/raw2.jpg");
    1.67 +	CredRaw[2] = gc->texman->AddTexture("data/textures/credits/raw3.jpg");
    1.68 +	CredRaw[3] = gc->texman->AddTexture("data/textures/credits/raw4.jpg");
    1.69 +	CredRaw[4] = gc->texman->AddTexture("data/textures/credits/raw5.jpg");
    1.70 +	CredRaw[5] = gc->texman->AddTexture("data/textures/credits/raw6.jpg");
    1.71 +	CredRaw[6] = gc->texman->AddTexture("data/textures/credits/raw7.jpg");
    1.72 +
    1.73 +	CredAmi[0] = gc->texman->AddTexture("data/textures/credits/am1.jpg");
    1.74 +	CredAmi[1] = gc->texman->AddTexture("data/textures/credits/am2.jpg");
    1.75 +	CredAmi[2] = gc->texman->AddTexture("data/textures/credits/am3.jpg");
    1.76 +	CredAmi[3] = gc->texman->AddTexture("data/textures/credits/am4.jpg");
    1.77 +	CredAmi[4] = gc->texman->AddTexture("data/textures/credits/am5.jpg");
    1.78 +	CredAmi[5] = gc->texman->AddTexture("data/textures/credits/am6.jpg");
    1.79 +	CredAmi[6] = gc->texman->AddTexture("data/textures/credits/am7.jpg");
    1.80 +
    1.81 +	CredAmv[0] = gc->texman->AddTexture("data/textures/credits/amv1.jpg");
    1.82 +	CredAmv[1] = gc->texman->AddTexture("data/textures/credits/amv2.jpg");
    1.83 +	CredAmv[2] = gc->texman->AddTexture("data/textures/credits/amv3.jpg");
    1.84 +	CredAmv[3] = gc->texman->AddTexture("data/textures/credits/amv4.jpg");
    1.85 +	CredAmv[4] = gc->texman->AddTexture("data/textures/credits/amv5.jpg");
    1.86 +	CredAmv[5] = gc->texman->AddTexture("data/textures/credits/amv6.jpg");
    1.87 +	CredAmv[6] = gc->texman->AddTexture("data/textures/credits/amv7.jpg");
    1.88 +
    1.89 +	Credits = new Object(gc);
    1.90 +	Credits->CreatePlane(1.7f, 0);
    1.91 +	Credits->Scale(1.0f, 0.3f, 1.0f);
    1.92 +
    1.93 +	Blood = scene->GetObject("Blood");
    1.94 +	scene->RemoveObject(Blood);
    1.95 +	Grail = scene->GetObject("Object13");
    1.96 +	//scene->RemoveObject(Grail);
    1.97 +}
    1.98 +
    1.99 +HellPart::~HellPart() {
   1.100 +	delete scene;
   1.101 +}
   1.102 +
   1.103 +void HellPart::MainLoop() {
   1.104 +	dword msec = timer.GetMilliSec();
   1.105 +	float t = msec / 1000.0f;
   1.106 +
   1.107 +	// deform blood surface
   1.108 +	Vertex *BloodVerts = Blood->GetTriMesh()->GetModVertexArray();
   1.109 +	dword VertexCount = Blood->GetTriMesh()->GetVertexCount();
   1.110 +
   1.111 +	for(dword i=0; i<VertexCount; i++) {
   1.112 +		Vector2 pos2d(BloodVerts[i].pos.x, BloodVerts[i].pos.z);
   1.113 +		float dist = pos2d.Length();
   1.114 +		BloodVerts[i].pos.y = (1.5f * sinf(dist - t*3.0f)) * (dist > 0.0f ? (1.0f / (dist*1.5f)) : 1.0f);
   1.115 +	}
   1.116 +	Blood->GetTriMesh()->CalculateNormals();
   1.117 +
   1.118 +	
   1.119 +	////////////////////////
   1.120 +
   1.121 +	gc->Clear(0);
   1.122 +	gc->ClearZBufferStencil(1.0f, 0);
   1.123 +
   1.124 +	scene->SetActiveCamera(cam);
   1.125 +
   1.126 +	if(t >= 18.0f && t < 22.0f) {
   1.127 +		scene->SetActiveCamera(cam2);
   1.128 +		Credits->material.SetTexture(CredNuc[(int)(t * 20.0f) % 7], TextureMap);
   1.129 +	}
   1.130 +	if(t >= 24.0f && t < 28.0f) {
   1.131 +		scene->SetActiveCamera(cam3);
   1.132 +		Credits->material.SetTexture(CredRaw[(int)(t * 20.0f) % 7], TextureMap);
   1.133 +	}
   1.134 +	if(t >= 30.0f && t < 34.0f) {
   1.135 +		scene->SetActiveCamera(cam2);
   1.136 +		Credits->material.SetTexture(CredAmi[(int)(t * 20.0f) % 7], TextureMap);
   1.137 +	}
   1.138 +	if(t >= 36.0f && t < 40.0f) {
   1.139 +		scene->SetActiveCamera(cam3);
   1.140 +		Credits->material.SetTexture(CredAmv[(int)(t * 20.0f) % 7], TextureMap);
   1.141 +	}
   1.142 +
   1.143 +	cam->FollowPath(msec);
   1.144 +
   1.145 +	gc->SetAmbientLight(Color(0.5f));
   1.146 +
   1.147 +	scene->Render();
   1.148 +
   1.149 +	for(int i=0; i<5; i++) {
   1.150 +		Matrix4x4 tmat = Stones[i]->TransMat, rmat = Stones[i]->GRotMat;
   1.151 +		Stones[i]->Translate(0.0f, sinf(t) * 54.0f, 0.0f);
   1.152 +		Stones[i]->GlobalRotate(0.0f, t/4.0f, 0.0f);
   1.153 +		
   1.154 +		Stones[i]->Render();
   1.155 +		
   1.156 +		Stones[i]->TransMat = tmat;
   1.157 +		Stones[i]->GRotMat = rmat;
   1.158 +	}
   1.159 +
   1.160 +	float Rot = t / 2.0f;
   1.161 +
   1.162 +	for(int i=0; i<5; i++) {
   1.163 +		Rings[i]->ResetRotation();
   1.164 +	}
   1.165 +
   1.166 +	Rings[0]->Rotate(Rot, 0.0f, 0.0f);
   1.167 +
   1.168 +	Rings[1]->Rotate(0.0f, 0.0f, Rot);
   1.169 +
   1.170 +	Vector3 axis(1.0f, 0.0f, 0.0f);
   1.171 +	axis.Rotate(0.0f, 0.0f, QuarterPi);
   1.172 +	Rings[2]->Rotate(0.0f, 0.0f, QuarterPi);
   1.173 +	Rings[2]->Rotate(axis, Rot);
   1.174 +
   1.175 +	axis = Vector3(0.0f, 0.0f, 1.0f);
   1.176 +	axis.Rotate(QuarterPi, 0.0f, 0.0f);
   1.177 +	Rings[3]->Rotate(QuarterPi, 0.0f, 0.0f);
   1.178 +	Rings[3]->Rotate(axis, Rot);
   1.179 +
   1.180 +	Rings[4]->Rotate(Rot, 0.0f, Rot);
   1.181 +
   1.182 +	gc->SetZWrite(false);
   1.183 +	for(int i=0; i<5; i++) {
   1.184 +		Rings[i]->Render();
   1.185 +	}
   1.186 +	gc->SetZWrite(true);
   1.187 +
   1.188 +	Light *light = scene->GetLight("Spot01");
   1.189 +	light->SetRange(100000.0f);
   1.190 +	light->SetIntensity(0.5f);
   1.191 +	light->SetLight(0, gc);
   1.192 +	Blood->Render();
   1.193 +	light->SetRange(100.0f);
   1.194 +	light->SetLight(0, gc);
   1.195 +
   1.196 +	gc->SetAmbientLight(Color(0.0f));
   1.197 +
   1.198 +	if((t >= 18.0f && t < 22.0f) || (t >= 24.0f && t < 28.0f) || (t >= 30.0f && t < 34.0f) || (t >= 36.0f && t < 40.0f)) {
   1.199 +		gc->SetAlphaBlending(true);
   1.200 +		gc->SetLighting(false);
   1.201 +		gc->SetZBuffering(false);
   1.202 +		gc->SetBlendFunc(BLEND_ONE, BLEND_ONE);
   1.203 +		gc->SetMaterial(Material(1.0f, 1.0f, 1.0f));
   1.204 +		gc->SetTexture(0, Credits->material.Maps[TextureMap]);
   1.205 +		gc->SetTexture(1, 0);
   1.206 +		gc->SetTextureCoordIndex(0, 0);
   1.207 +
   1.208 +		gc->SetTextureStageColor(0, TexBlendSelectArg1, TexArgTexture, TexArgCurrent);
   1.209 +		gc->SetTextureStageAlpha(0, TexBlendSelectArg1, TexArgTexture, TexArgCurrent);
   1.210 +		Matrix4x4 WorldMat;
   1.211 +		WorldMat.Scale(1.0f, 0.3f, 1.0f);
   1.212 +		gc->SetWorldMatrix(WorldMat);
   1.213 +		Matrix4x4 ViewMat;
   1.214 +		ViewMat.Translate(0.0f, 0.0f, 2.0f);
   1.215 +		gc->SetViewMatrix(ViewMat);
   1.216 +		Matrix4x4 ProjMat, OldProj;
   1.217 +		OldProj = gc->GetProjectionMatrix();
   1.218 +		CreateProjectionMatrix(&ProjMat, QuarterPi, 1.333333f, 1.0f, 10.0f);
   1.219 +		gc->SetProjectionMatrix(ProjMat);
   1.220 +
   1.221 +        Credits->RenderBare();
   1.222 +
   1.223 +		gc->SetProjectionMatrix(OldProj);
   1.224 +		gc->SetLighting(true);
   1.225 +		gc->SetZBuffering(true);
   1.226 +		gc->SetAlphaBlending(false);
   1.227 +	}
   1.228 +}
   1.229 \ No newline at end of file