|
|
|
@ -279,6 +279,9 @@ void FaceBall::LoadLevel(int level) |
|
|
|
|
bool FaceBall::CheckCollision(vec3d movementVector,vf2d pos,float radius){ |
|
|
|
|
utils::geom2d::circle<float>newPos{ {pos.x + movementVector.x,pos.y + movementVector.z},radius }; |
|
|
|
|
bool collisionOccured = false; |
|
|
|
|
if (pos.x - radius > game->MAP_SIZE.x || pos.x + radius<0 || pos.y - radius>game->MAP_SIZE.y || pos.y + radius < 0) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
for (int y = -1; y <= 1; y++) { |
|
|
|
|
for (int x = -1; x <= 1; x++) { |
|
|
|
|
int offsetX = (int)pos.x + x; |
|
|
|
@ -821,6 +824,140 @@ void FaceBall::RenderMesh(mat4x4&matView,std::vector<Triangle>&vecTrianglesToRas |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FaceBall::RenderPowerupMesh(mat4x4& matView, std::vector<Triangle>& vecTrianglesToRaster, Powerup&p) { |
|
|
|
|
for (int i = 0; i < 2; i++) { |
|
|
|
|
for (auto& tri : p.mesh.tris) { |
|
|
|
|
Triangle triProjected, triTransformed, triViewed; |
|
|
|
|
mat4x4 localMat = Matrix_MakeIdentity(); |
|
|
|
|
mat4x4 rotMat = Matrix_MakeRotationY(p.rot); |
|
|
|
|
if (i) { |
|
|
|
|
mat4x4 flipMat = Matrix_MakeRotationX(PI); |
|
|
|
|
rotMat = Matrix_MultiplyMatrix(rotMat, flipMat); |
|
|
|
|
} |
|
|
|
|
localMat = Matrix_MultiplyMatrix(localMat, rotMat); |
|
|
|
|
mat4x4 matTrans = Matrix_MakeTranslation(p.pos.x, p.pos.y+(i?0.375f:0), p.pos.z); |
|
|
|
|
localMat = Matrix_MultiplyMatrix(localMat, matTrans); |
|
|
|
|
|
|
|
|
|
triTransformed.p[0] = Matrix_MultiplyVector(localMat, tri.p[0]); |
|
|
|
|
triTransformed.p[1] = Matrix_MultiplyVector(localMat, tri.p[1]); |
|
|
|
|
triTransformed.p[2] = Matrix_MultiplyVector(localMat, tri.p[2]); |
|
|
|
|
triTransformed.uv[0] = tri.uv[0]; |
|
|
|
|
triTransformed.uv[1] = tri.uv[1]; |
|
|
|
|
triTransformed.uv[2] = tri.uv[2]; |
|
|
|
|
triTransformed.col[0] = tri.col[0]; |
|
|
|
|
triTransformed.col[1] = tri.col[1]; |
|
|
|
|
triTransformed.col[2] = tri.col[2]; |
|
|
|
|
triTransformed.tex = tri.tex; |
|
|
|
|
|
|
|
|
|
vec3d normal, line1, line2; |
|
|
|
|
line1 = Vector_Sub(triTransformed.p[1], triTransformed.p[0]); |
|
|
|
|
line2 = Vector_Sub(triTransformed.p[2], triTransformed.p[0]); |
|
|
|
|
|
|
|
|
|
normal = Vector_CrossProduct(line1, line2); |
|
|
|
|
normal = Vector_Normalise(normal); |
|
|
|
|
|
|
|
|
|
vec3d vCameraRay = Vector_Sub(triTransformed.p[0], freeRoam ? freeRoamCamera : player.GetPos()); |
|
|
|
|
|
|
|
|
|
if (Vector_DotProduct(normal, vCameraRay) < 0) { |
|
|
|
|
vec3d light_dir = Vector_Mul(vLookDir, -1); |
|
|
|
|
light_dir = Vector_Normalise(light_dir); |
|
|
|
|
|
|
|
|
|
float dp = std::max(0.7f, Vector_DotProduct(light_dir, normal)); |
|
|
|
|
|
|
|
|
|
triViewed.p[0] = Matrix_MultiplyVector(matView, triTransformed.p[0]); |
|
|
|
|
triViewed.p[1] = Matrix_MultiplyVector(matView, triTransformed.p[1]); |
|
|
|
|
triViewed.p[2] = Matrix_MultiplyVector(matView, triTransformed.p[2]); |
|
|
|
|
triViewed.uv[0] = triTransformed.uv[0]; |
|
|
|
|
triViewed.uv[1] = triTransformed.uv[1]; |
|
|
|
|
triViewed.uv[2] = triTransformed.uv[2]; |
|
|
|
|
triViewed.col[0] = Pixel(triTransformed.col[0].r * dp * dp, triTransformed.col[0].g * dp * dp, triTransformed.col[0].b * dp * dp); |
|
|
|
|
triViewed.col[1] = Pixel(triTransformed.col[1].r * dp * dp, triTransformed.col[1].g * dp * dp, triTransformed.col[1].b * dp * dp); |
|
|
|
|
triViewed.col[2] = Pixel(triTransformed.col[2].r * dp * dp, triTransformed.col[2].g * dp * dp, triTransformed.col[2].b * dp * dp); |
|
|
|
|
Pixel originalCol[3] = { triViewed.col[0],triViewed.col[1],triViewed.col[2] }; |
|
|
|
|
float dist = std::sqrtf(std::powf((freeRoam ? freeRoamCamera : player.GetPos()).x - triTransformed.p[0].x, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).y - triTransformed.p[0].y, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).z - triTransformed.p[0].z, 2)); |
|
|
|
|
float dist2 = std::sqrtf(std::powf((freeRoam ? freeRoamCamera : player.GetPos()).x - triTransformed.p[1].x, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).y - triTransformed.p[1].y, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).z - triTransformed.p[1].z, 2)); |
|
|
|
|
float dist3 = std::sqrtf(std::powf((freeRoam ? freeRoamCamera : player.GetPos()).x - triTransformed.p[2].x, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).y - triTransformed.p[2].y, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).z - triTransformed.p[2].z, 2)); |
|
|
|
|
float colorMult = dist > 5 * PI / 3 ? 0 : std::sinf(0.3 * dist + PI / 2); |
|
|
|
|
float colorMult2 = dist2 > 5 * PI / 3 ? 0 : std::sinf(0.3 * dist2 + PI / 2); |
|
|
|
|
float colorMult3 = dist3 > 5 * PI / 3 ? 0 : std::sinf(0.3 * dist3 + PI / 2); |
|
|
|
|
triViewed.col[0] = Pixel(triViewed.col[0].r * colorMult, triViewed.col[0].g * colorMult, triViewed.col[0].b * colorMult); |
|
|
|
|
triViewed.col[1] = Pixel(triViewed.col[1].r * colorMult2, triViewed.col[1].g * colorMult2, triViewed.col[1].b * colorMult2); |
|
|
|
|
triViewed.col[2] = Pixel(triViewed.col[2].r * colorMult3, triViewed.col[2].g * colorMult3, triViewed.col[2].b * colorMult3); |
|
|
|
|
triViewed.tex = triTransformed.tex; |
|
|
|
|
|
|
|
|
|
for (Bullet& b : bullets) { |
|
|
|
|
float dist = std::sqrtf(std::powf(b.pos.x - triTransformed.p[0].x, 2) + std::powf(b.pos.y - triTransformed.p[0].y, 2) + std::powf(b.pos.z - triTransformed.p[0].z, 2)); |
|
|
|
|
float dist2 = std::sqrtf(std::powf(b.pos.x - triTransformed.p[1].x, 2) + std::powf(b.pos.y - triTransformed.p[1].y, 2) + std::powf(b.pos.z - triTransformed.p[1].z, 2)); |
|
|
|
|
float dist3 = std::sqrtf(std::powf(b.pos.x - triTransformed.p[2].x, 2) + std::powf(b.pos.y - triTransformed.p[2].y, 2) + std::powf(b.pos.z - triTransformed.p[2].z, 2)); |
|
|
|
|
float colorMult = (dist < 2 ? std::sinf(0.75 * dist + PI / 2) * 4 : 1); |
|
|
|
|
float colorMult2 = (dist2 < 2 ? std::sinf(0.75 * dist2 + PI / 2) * 4 : 1); |
|
|
|
|
float colorMult3 = (dist3 < 2 ? std::sinf(0.75 * dist3 + PI / 2) * 4 : 1); |
|
|
|
|
Pixel lightCol = b.col / 2 + Pixel{ 128, 128, 128 }; |
|
|
|
|
if (dist < 2) { triViewed.col[0] = Pixel(std::min(255, std::max((int)originalCol[0].r, (int)(originalCol[0].r * colorMult / float(255.f / lightCol.r)))), std::min(255, std::max((int)originalCol[0].g, (int)(originalCol[0].g * colorMult / float(255.f / lightCol.g)))), std::min(255, std::max((int)originalCol[0].b, (int)(originalCol[0].b * colorMult / float(255.f / lightCol.b))))); } |
|
|
|
|
if (dist2 < 2) { triViewed.col[1] = Pixel(std::min(255, std::max((int)originalCol[1].r, (int)(originalCol[1].r * colorMult2 / float(255.f / lightCol.r)))), std::min(255, std::max((int)originalCol[1].g, (int)(originalCol[1].g * colorMult2 / float(255.f / lightCol.g)))), std::min(255, std::max((int)originalCol[1].b, (int)(originalCol[1].b * colorMult2 / float(255.f / lightCol.b))))); } |
|
|
|
|
if (dist3 < 2) { triViewed.col[2] = Pixel(std::min(255, std::max((int)originalCol[2].r, (int)(originalCol[2].r * colorMult3 / float(255.f / lightCol.r)))), std::min(255, std::max((int)originalCol[2].g, (int)(originalCol[2].g * colorMult3 / float(255.f / lightCol.g)))), std::min(255, std::max((int)originalCol[2].b, (int)(originalCol[2].b * colorMult3 / float(255.f / lightCol.b))))); } |
|
|
|
|
} |
|
|
|
|
//triViewed.col = triTransformed.col;
|
|
|
|
|
|
|
|
|
|
int nClippedTriangles = 0; |
|
|
|
|
Triangle clipped[2]; |
|
|
|
|
nClippedTriangles = Triangle_ClipAgainstPlane({ 0.0f, 0.0f, 0.1f }, { 0.0f, 0.0f, 1.0f }, triViewed, clipped[0], clipped[1]); |
|
|
|
|
|
|
|
|
|
for (int n = 0; n < nClippedTriangles; n++) { |
|
|
|
|
// Project triangles from 3D --> 2D
|
|
|
|
|
triProjected.p[0] = Matrix_MultiplyVector(matProj, clipped[n].p[0]); |
|
|
|
|
triProjected.p[1] = Matrix_MultiplyVector(matProj, clipped[n].p[1]); |
|
|
|
|
triProjected.p[2] = Matrix_MultiplyVector(matProj, clipped[n].p[2]); |
|
|
|
|
triProjected.col[0] = clipped[n].col[0]; |
|
|
|
|
triProjected.col[1] = clipped[n].col[1]; |
|
|
|
|
triProjected.col[2] = clipped[n].col[2]; |
|
|
|
|
triProjected.tex = clipped[n].tex; |
|
|
|
|
triProjected.uv[0] = clipped[n].uv[0]; |
|
|
|
|
triProjected.uv[1] = clipped[n].uv[1]; |
|
|
|
|
triProjected.uv[2] = clipped[n].uv[2]; |
|
|
|
|
triProjected.uv[0].u = triProjected.uv[0].u / triProjected.p[0].w; |
|
|
|
|
triProjected.uv[1].u = triProjected.uv[1].u / triProjected.p[1].w; |
|
|
|
|
triProjected.uv[2].u = triProjected.uv[2].u / triProjected.p[2].w; |
|
|
|
|
|
|
|
|
|
triProjected.uv[0].v = triProjected.uv[0].v / triProjected.p[0].w; |
|
|
|
|
triProjected.uv[1].v = triProjected.uv[1].v / triProjected.p[1].w; |
|
|
|
|
triProjected.uv[2].v = triProjected.uv[2].v / triProjected.p[2].w; |
|
|
|
|
|
|
|
|
|
triProjected.uv[0].w = 1.0f / triProjected.p[0].w; |
|
|
|
|
triProjected.uv[1].w = 1.0f / triProjected.p[1].w; |
|
|
|
|
triProjected.uv[2].w = 1.0f / triProjected.p[2].w; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
triProjected.p[0] = Vector_Div(triProjected.p[0], triProjected.p[0].w); |
|
|
|
|
triProjected.p[1] = Vector_Div(triProjected.p[1], triProjected.p[1].w); |
|
|
|
|
triProjected.p[2] = Vector_Div(triProjected.p[2], triProjected.p[2].w); |
|
|
|
|
|
|
|
|
|
triProjected.p[0].x *= -1.0f; |
|
|
|
|
triProjected.p[1].x *= -1.0f; |
|
|
|
|
triProjected.p[2].x *= -1.0f; |
|
|
|
|
triProjected.p[0].y *= -1.0f; |
|
|
|
|
triProjected.p[1].y *= -1.0f; |
|
|
|
|
triProjected.p[2].y *= -1.0f; |
|
|
|
|
|
|
|
|
|
// Scale into view
|
|
|
|
|
vec3d vOffsetView = { 1,1,0 }; |
|
|
|
|
triProjected.p[0] = Vector_Add(triProjected.p[0], vOffsetView); |
|
|
|
|
triProjected.p[1] = Vector_Add(triProjected.p[1], vOffsetView); |
|
|
|
|
triProjected.p[2] = Vector_Add(triProjected.p[2], vOffsetView); |
|
|
|
|
triProjected.p[0].x *= 0.5f * (float)ScreenWidth(); |
|
|
|
|
triProjected.p[0].y *= 0.5f * (float)ScreenHeight(); |
|
|
|
|
triProjected.p[1].x *= 0.5f * (float)ScreenWidth(); |
|
|
|
|
triProjected.p[1].y *= 0.5f * (float)ScreenHeight(); |
|
|
|
|
triProjected.p[2].x *= 0.5f * (float)ScreenWidth(); |
|
|
|
|
triProjected.p[2].y *= 0.5f * (float)ScreenHeight(); |
|
|
|
|
|
|
|
|
|
vecTrianglesToRaster.push_back(triProjected); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FaceBall::RenderMeshDeathScreen(mat4x4& matView, std::vector<Triangle>& vecTrianglesToRaster, Object& o) { |
|
|
|
|
for (auto& tri : o.mesh.tris) { |
|
|
|
|
Triangle triProjected, triTransformed, triViewed; |
|
|
|
@ -987,7 +1124,7 @@ void FaceBall::RenderWorld() { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (auto& powerup : powerups) { |
|
|
|
|
RenderMesh(matView, vecTrianglesToRaster, powerup); |
|
|
|
|
RenderPowerupMesh(matView, vecTrianglesToRaster, powerup); |
|
|
|
|
} |
|
|
|
|
for (auto& bullet : bullets) { |
|
|
|
|
RenderBulletMesh(matView, vecTrianglesToRasterTranslucent, bullet); |
|
|
|
@ -1866,11 +2003,14 @@ void FaceBall::RunEnemyAI(Enemy& e,float fElapsedTime,int myIndex) { |
|
|
|
|
bool FaceBall::OnUserUpdate(float fElapsedTime) |
|
|
|
|
{ |
|
|
|
|
gameTimer += fElapsedTime; |
|
|
|
|
for (std::vector<Bullet>::iterator it = bullets.end(); it != bullets.begin();) { |
|
|
|
|
Bullet& b = *--it; |
|
|
|
|
for (std::vector<Bullet>::iterator it = bullets.begin(); it != bullets.end();) { |
|
|
|
|
Bullet& b = *it; |
|
|
|
|
if (!b.Update(fElapsedTime)) { |
|
|
|
|
it=bullets.erase(it); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
it++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < enemies.size(); i++) { |
|
|
|
|
Enemy& e = enemies[i]; |
|
|
|
@ -1880,11 +2020,14 @@ bool FaceBall::OnUserUpdate(float fElapsedTime) |
|
|
|
|
} |
|
|
|
|
RunEnemyAI(e, fElapsedTime,i); |
|
|
|
|
} |
|
|
|
|
for (std::vector<Powerup>::iterator it = powerups.end(); it != powerups.begin();) { |
|
|
|
|
Powerup& p = *--it; |
|
|
|
|
for (std::vector<Powerup>::iterator it = powerups.begin(); it != powerups.end();) { |
|
|
|
|
Powerup& p = *it; |
|
|
|
|
if (!p.Update(fElapsedTime)) { |
|
|
|
|
it = powerups.erase(it); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
it++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
switch (mode) { |
|
|
|
|
case GAME: { |
|
|
|
|