ho3/Template/gameMap.cpp

263 lines
4.9 KiB
C++
Raw Normal View History

2024-06-06 13:25:38 +00:00
#include "gameMap.h"
using namespace SE;
TMapCharacter::TMapCharacter() :
Pos(ZeroVec3),
RotationMatrix(IdentityMatrix),
Direction(vec3(0.0f, 0.0f, 1.0f)),
Destination(ZeroVec3),
VectorToDestination(ZeroVec3),
Velocity(0.0f)
{
}
void TMapCharacter::SetPos(vec3& pos)
{
Pos = pos;
}
void TMapCharacter::GoToDestination(vec3& dest)
{
Destination = vec3(dest.v[0], 0.0f, dest.v[2]);
Velocity = 0.002f;
}
void TMapCharacter::Update(cardinal timer)
{
const float CONST_DISTANCE_SLOW_DOWN = 1.0f;
const float CONST_DISTANCE_STOP = 0.1f;
const float CONST_ROTATION_ANGLE_STEP = pi/200;
VectorToDestination = (Destination - Pos);
VectorToDestination.v[1] = 0.0f;
VectorToDestination = Normalize(VectorToDestination);
if (!IsFloatEqual(Velocity, 0.0f))
{
float cosa = DotProduct(VectorToDestination, Direction);
float alpha = acosf(cosa);
if (alpha <= CONST_ROTATION_ANGLE_STEP * timer)
{
Direction = VectorToDestination;
}
else
{
vec3 n = Normalize(CrossProduct(Direction, VectorToDestination));
float sinb = sinf(CONST_ROTATION_ANGLE_STEP * timer / 2.0f);
float cosb = cosf(CONST_ROTATION_ANGLE_STEP * timer / 2.0f);
vec4 q;
q.v[0] = n.v[0] * sinb;
q.v[1] = n.v[1] * sinb;
q.v[2] = n.v[2] * sinb;
q.v[3] = cosb;
mat3 rmat = mat3(q);
RotationMatrix *= rmat;
Direction = rmat * Direction;
}
}
if (!(Pos == Destination))
{
float dist = sqrtf((Pos.v[0] - Destination.v[0])*(Pos.v[0] - Destination.v[0]) +
(Pos.v[1] - Destination.v[1])*(Pos.v[1] - Destination.v[1]) +
(Pos.v[2] - Destination.v[2])*(Pos.v[2] - Destination.v[2]));
if (dist > CONST_DISTANCE_SLOW_DOWN)
{
Pos = Pos + timer*Velocity*Direction;
}
else if (dist > CONST_DISTANCE_STOP && dist <= CONST_DISTANCE_SLOW_DOWN)
{
Pos = Pos + 0.5f*timer*Velocity*Direction;
}
else
{
Pos = Destination;
Velocity = 0.0f;
VectorToDestination = ZeroVec3;
}
}
}
vec3 TMapCharacter::GetPos()
{
return Pos;
}
mat3 TMapCharacter::GetRotationMatrix()
{
return RotationMatrix;
}
void TGameMap::LoadMap()
{
Land = new TSimpleLandClass;
Land->LoadFromFile(std::string("landscapes/out.ls1"));
Land->SetTexture(std::string("landscapes/out.bmp"));
Land->Scale(0.005f);
2024-06-08 22:38:37 +00:00
StaticModelArr.resize(3);
2024-06-06 13:25:38 +00:00
StaticModelArr[0].LoadModel("bt_box_yellow.lm1");
2024-06-08 22:38:37 +00:00
StaticModelArr[1].LoadModel("bt_box_red.lm1");
StaticModelArr[2].LoadModel("bt_box_blue.lm1");
StaticModelArr[0].ScaleModel(2.0);
StaticModelArr[0].RotateModel(mat3(vec4(0.0, sin(pi/6), 0.0, cos(pi/6))));
StaticModelArr[0].MoveModel(vec3(-1.0f, 0.13f, 4.3f));
StaticModelArr[1].ScaleModel(2.0);
StaticModelArr[1].RotateModel(mat3(vec4(-sin(pi / 3), 0.0, 0.0, cos(pi / 3))));
StaticModelArr[1].RotateModel(mat3(vec4(0.0, -sin(pi / 4), 0.0, cos(pi / 4))));
StaticModelArr[1].MoveModel(vec3(-6.0f, 0.0f, 8.8f));
StaticModelArr[2].ScaleModel(2.0);
StaticModelArr[2].MoveModel(vec3(-1.5f, 0.23f, 7.8f));
2024-06-06 13:25:38 +00:00
2024-06-08 22:38:37 +00:00
StaticModelArr[0].UpdateVBO();
StaticModelArr[1].UpdateVBO();
StaticModelArr[2].UpdateVBO();
//StaticModelArr[0].SetShaderTranslateVector(vec3(-1.0f, 0.23f, 6.3f));
2024-06-06 13:25:38 +00:00
PlayerChar = new TLiteModel;
PlayerChar->LoadModel("bt_cone.lm1");
AnimModel = new TAnimModel;
AnimModel->LoadModel("bonemodel.lm1");
animSeq = 0;
//AnimModel->ApplySequence("bonemodel.an1", animSeq);
GirlText = new TAnimModel;
GirlText->LoadModel("girl.lm1");
//GirlText->ScaleModel(0.1f);
//GirlText->MoveModel(vec3(0,4,0));
//GirlText->UpdateVBO();
//GirlText->ApplySequence("girl.an1", 0);
MapChar.SetPos(vec3(0.0f, 0.0f, 10.0f));
}
void TGameMap::FreeMap()
{
if (Land)
{
delete Land;
Land = NULL;
}
if (PlayerChar)
{
delete PlayerChar;
PlayerChar = NULL;
}
if (AnimModel)
{
delete AnimModel;
AnimModel = NULL;
}
if (GirlText)
{
delete GirlText;
GirlText = NULL;
}
StaticModelArr.clear();
}
TSimpleLandClass* TGameMap::GetLand()
{
return Land;
}
void TGameMap::DrawVBO()
{
2024-06-08 17:55:56 +00:00
Land->DrawVBO();
2024-06-06 13:25:38 +00:00
for (TLiteModelArr::iterator i = StaticModelArr.begin(); i != StaticModelArr.end(); ++i)
{
//i->DrawImmediate();
i->DrawVBO();
}
//PlayerChar->DrawVBO();
//AnimModel->DrawVBO();
//GirlText->DrawVBO();
}
cardinal timeForSeq = 0;
void TGameMap::Update(cardinal timer)
{
MapChar.Update(timer);
vec3 vecFrom, vecTo;
vec3 pos = Land->CalcVerticalCrossing(MapChar.GetPos());
PlayerChar->SetShaderTranslateVector(pos);
PlayerChar->SetShaderRotateMatrix(MapChar.GetRotationMatrix());
timeForSeq += timer;
if (timeForSeq >= 2000)
{
timeForSeq = 0;
if (animSeq != 12)
{
animSeq = 12;
//animSeq+= 1;
if (animSeq >= 100)
{
animSeq = 0;
}
//GirlText->ApplySequence("girl.an1", animSeq);
//GirlText->UpdateVBO();
}
}
//AnimModel->ApplySequence("bonemodel.an1", animSeq);
//AnimModel->UpdateVBO();
}
void TGameMap::PlayerClicked(int x, int y)
{
/*
vec3 vecFrom, vecTo;
SalmonRender->GetVectorOutOfCursor(x, y, vecFrom, vecTo);
vec3 r = Land->CalcCrossing(vecFrom, vecTo);
MapChar.GoToDestination(r);
*/
}