|
|
@ -867,9 +867,9 @@ Model LoadCubicmap(Image cubesmap) |
|
|
|
} RectangleF; |
|
|
|
|
|
|
|
RectangleF rightTexUV = { 0, 0, 0.5, 0.5 }; |
|
|
|
RectangleF leftTexUV = { 0.5, 0, 0.25, 0.25 }; |
|
|
|
RectangleF frontTexUV = { f">0.75, 0, 0.25, 0.25 }; |
|
|
|
RectangleF backTexUV = { 0.5, f">0.25, 0.25, 0.25 }; |
|
|
|
RectangleF leftTexUV = { 0.5, 0, 0.5, 0.5 }; |
|
|
|
RectangleF frontTexUV = { i">0, 0, 0.5, 0.5 }; |
|
|
|
RectangleF backTexUV = { 0.5, i">0, 0.5, 0.5 }; |
|
|
|
RectangleF topTexUV = { 0, 0.5, 0.5, 0.5 }; |
|
|
|
RectangleF bottomTexUV = { 0.5, 0.5, 0.5, 0.5 }; |
|
|
|
|
|
|
@ -1678,4 +1678,156 @@ bool CheckCollisionBoxSphere(Vector3 minBBox, Vector3 maxBBox, Vector3 centerSph |
|
|
|
return collision; |
|
|
|
} |
|
|
|
|
|
|
|
//BoundingBox GetCollisionArea(BoundingBox box1, BoundingBox box2) |
|
|
|
// TODO |
|
|
|
//BoundingBox GetCollisionArea(BoundingBox box1, BoundingBox box2) |
|
|
|
|
|
|
|
// Detect and resolve cubicmap collisions |
|
|
|
// NOTE: player position (or camera) is modified inside this function |
|
|
|
void ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *playerPosition) |
|
|
|
{ |
|
|
|
// Detect the cell where the player is located |
|
|
|
int locationCellX = 0; |
|
|
|
int locationCellY = 0; |
|
|
|
|
|
|
|
locationCellX = floor(playerPosition->x + mapPosition.x + 0.5); |
|
|
|
locationCellY = floor(playerPosition->z + mapPosition.z + 0.5); |
|
|
|
|
|
|
|
// Multiple Axis -------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Axis x-, y- |
|
|
|
if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r != 0) && |
|
|
|
(cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r != 0)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX < 0.3) && |
|
|
|
((playerPosition->z + 0.5f) - locationCellY < 0.3)) |
|
|
|
{ |
|
|
|
playerPosition->x = locationCellX - 0.2; |
|
|
|
playerPosition->z = locationCellY - 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Axis x-, y+ |
|
|
|
if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r != 0) && |
|
|
|
(cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r != 0)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX < 0.3) && |
|
|
|
((playerPosition->z + 0.5f) - locationCellY > 0.7)) |
|
|
|
{ |
|
|
|
playerPosition->x = locationCellX - 0.2; |
|
|
|
playerPosition->z = locationCellY + 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Axis x+, y- |
|
|
|
if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r != 0) && |
|
|
|
(cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r != 0)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX > 0.7) && |
|
|
|
((playerPosition->z + 0.5f) - locationCellY < 0.3)) |
|
|
|
{ |
|
|
|
playerPosition->x = locationCellX + 0.2; |
|
|
|
playerPosition->z = locationCellY - 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Axis x+, y+ |
|
|
|
if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r != 0) && |
|
|
|
(cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r != 0)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX > 0.7) && |
|
|
|
((playerPosition->z + 0.5f) - locationCellY > 0.7)) |
|
|
|
{ |
|
|
|
playerPosition->x = locationCellX + 0.2f; |
|
|
|
playerPosition->z = locationCellY + 0.2f; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Single Axis --------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Axis x- |
|
|
|
if (cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r != 0) |
|
|
|
{ |
|
|
|
if ((playerPosition->x + 0.5f) - locationCellX < 0.3) |
|
|
|
{ |
|
|
|
playerPosition->x = locationCellX - 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
// Axis x+ |
|
|
|
if (cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r != 0) |
|
|
|
{ |
|
|
|
if ((playerPosition->x + 0.5f) - locationCellX > 0.7) |
|
|
|
{ |
|
|
|
playerPosition->x = locationCellX + 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
// Axis y- |
|
|
|
if (cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r != 0) |
|
|
|
{ |
|
|
|
if ((playerPosition->z + 0.5f) - locationCellY < 0.3) |
|
|
|
{ |
|
|
|
playerPosition->z = locationCellY - 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
// Axis y+ |
|
|
|
if (cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r != 0) |
|
|
|
{ |
|
|
|
if ((playerPosition->z + 0.5f) - locationCellY > 0.7) |
|
|
|
{ |
|
|
|
playerPosition->z = locationCellY + 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Diagonals ------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Axis x-, y- |
|
|
|
if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r == 0) && |
|
|
|
(cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r == 0) && |
|
|
|
(cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX - 1)].r != 0)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX < 0.3) && |
|
|
|
((playerPosition->z + 0.5f) - locationCellY < 0.3)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX) > ((playerPosition->z + 0.5f) - locationCellY)) playerPosition->x = locationCellX - 0.2; |
|
|
|
else playerPosition->z = locationCellY - 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Axis x-, y+ |
|
|
|
if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r == 0) && |
|
|
|
(cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r == 0) && |
|
|
|
(cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX - 1)].r != 0)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX < 0.3) && |
|
|
|
((playerPosition->z + 0.5f) - locationCellY > 0.7)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX) > (1 - ((playerPosition->z + 0.5f) - locationCellY))) playerPosition->x = locationCellX - 0.2; |
|
|
|
else playerPosition->z = locationCellY + 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Axis x+, y- |
|
|
|
if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r == 0) && |
|
|
|
(cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r == 0) && |
|
|
|
(cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX + 1)].r != 0)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX > 0.7) && |
|
|
|
((playerPosition->z + 0.5f) - locationCellY < 0.3)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX) < (1 - ((playerPosition->z + 0.5f) - locationCellY))) playerPosition->x = locationCellX + 0.2; |
|
|
|
else playerPosition->z = locationCellY - 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Axis x+, y+ |
|
|
|
if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r == 0) && |
|
|
|
(cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r == 0) && |
|
|
|
(cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX + 1)].r != 0)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX > 0.7) && |
|
|
|
((playerPosition->z + 0.5f) - locationCellY > 0.7)) |
|
|
|
{ |
|
|
|
if (((playerPosition->x + 0.5f) - locationCellX) < ((playerPosition->z + 0.5f) - locationCellY)) playerPosition->x = locationCellX + 0.2; |
|
|
|
else playerPosition->z = locationCellY + 0.2; |
|
|
|
} |
|
|
|
} |
|
|
|
} |