Add curved corners

This commit is contained in:
Miloslav Ciz 2024-12-12 23:17:06 +01:00
parent 485b09ccbc
commit 93cc5369bd
4 changed files with 79 additions and 5 deletions

View file

@ -24,6 +24,8 @@ static const char *LCR_maps[] =
"#=s0B0 #fd910" // concrete wall "#=s0B0 #fd910" // concrete wall
"#^s1A0 #fk110" // ramps before wall "#^s1A0 #fk110" // ramps before wall
"#nu0j1 #ly0j1 #AA0j1 "
"#vw0m0" "#vw0m0"
"#vx0m0J" "#vx0m0J"
"#vw0l0L" "#vw0l0L"

28
map.h
View file

@ -96,7 +96,6 @@
#define LCR_BLOCK_RAMP_12 '<' ///< plain ramp, 1/2 size #define LCR_BLOCK_RAMP_12 '<' ///< plain ramp, 1/2 size
#define LCR_BLOCK_RAMP_14 '_' ///< plain ramp, 1/4 size #define LCR_BLOCK_RAMP_14 '_' ///< plain ramp, 1/4 size
#define LCR_BLOCK_RAMP_CORNER 'v' ///< corner of ramp #define LCR_BLOCK_RAMP_CORNER 'v' ///< corner of ramp
#define LCR_BLOCK_RAMP_CURVED_PLAT ']' ///< curved ramp with top platgform #define LCR_BLOCK_RAMP_CURVED_PLAT ']' ///< curved ramp with top platgform
#define LCR_BLOCK_RAMP_CURVED ')' ///< curv. ramp without top platf. #define LCR_BLOCK_RAMP_CURVED ')' ///< curv. ramp without top platf.
#define LCR_BLOCK_RAMP_CURVED_WALL '}' ///< curved ramp plus small wall #define LCR_BLOCK_RAMP_CURVED_WALL '}' ///< curved ramp plus small wall
@ -108,6 +107,11 @@
#define LCR_BLOCK_FULL_FAN 'o' #define LCR_BLOCK_FULL_FAN 'o'
#define LCR_BLOCK_BUMP '~' ///< small bump on the road #define LCR_BLOCK_BUMP '~' ///< small bump on the road
#define LCR_BLOCK_CORNER_CONVEX 'n'
#define LCR_BLOCK_CORNER_CONCAVE 'l'
#define LCR_BLOCK_CHECKPOINT_0 '+' ///< checkpoint, not taken #define LCR_BLOCK_CHECKPOINT_0 '+' ///< checkpoint, not taken
#define LCR_BLOCK_CHECKPOINT_1 '\'' ///< checkpoint, taken #define LCR_BLOCK_CHECKPOINT_1 '\'' ///< checkpoint, taken
@ -821,6 +825,28 @@ void LCR_mapGetBlockShape(uint8_t blockType, uint8_t transform,
break; break;
} }
case LCR_BLOCK_CORNER_CONVEX:
case LCR_BLOCK_CORNER_CONCAVE:
{
uint8_t
mx = blockType == LCR_BLOCK_CORNER_CONVEX ? 4 : 2,
mz = blockType == LCR_BLOCK_CORNER_CONVEX ? 2 : 4;
ADD(0,0,0) ADD(0,4,6) ADD(0,0,6) // left
ADD(0,0,0) ADD(0,4,0) ADD(0,4,6) // left
ADD(6,0,6) ADD(0,0,6) ADD(0,4,6) // back
ADD(0,4,6) ADD(6,4,6) ADD(6,0,6) // back
ADD(0,0,0) ADD(mx,4,mz) ADD(0,4,0) // right
ADD(mx,0,mz) ADD(mx,4,mz) ADD(0,0,0)
ADD(6,4,6) ADD(mx,4,mz) ADD(6,0,6)
ADD(6,0,6) ADD(mx,4,mz) ADD(mx,0,mz)
ADD(0,4,0) ADD(mx,4,mz) ADD(0,4,6) // top
ADD(0,4,6) ADD(mx,4,mz) ADD(6,4,6)
ADD(0,0,0) ADD(0,0,6) ADD(mx,0,mz) // bottom
ADD(0,0,6) ADD(6,0,6) ADD(mx,0,mz)
break;
}
case LCR_BLOCK_BUMP: case LCR_BLOCK_BUMP:
ADD(3,0,0) ADD(6,0,3) ADD(3,1,3) // top ADD(3,0,0) ADD(6,0,3) ADD(3,1,3) // top
ADD(6,0,3) ADD(3,0,6) ADD(3,1,3) ADD(6,0,3) ADD(3,0,6) ADD(3,1,3)

View file

@ -205,6 +205,40 @@ TPE_Vec3 _LCR_racingBlockEnvFunc(TPE_Vec3 point, const uint8_t *block)
break; break;
} }
case LCR_BLOCK_CORNER_CONVEX:
case LCR_BLOCK_CORNER_CONCAVE:
{
TPE_Unit sides[6];
sides[0] = -1 * LCR_PHYSICS_UNIT / 2;
sides[1] = LCR_PHYSICS_UNIT / 2;
sides[2] = -1 * LCR_PHYSICS_UNIT / 2;
sides[3] = -1 * LCR_PHYSICS_UNIT / 2;
sides[4] = LCR_PHYSICS_UNIT / 5;
sides[5] = -1 * LCR_PHYSICS_UNIT / 5;
if (block[0] == LCR_BLOCK_CORNER_CONCAVE)
{
sides[4] *= -1;
sides[5] *= -1;
}
_CHECK_NEXT(TPE_envAATriPrism(point,TPE_vec3(0,0,0),sides,LCR_PHYSICS_UNIT / 2
,1));
sides[2] = sides[4];
sides[3] = sides[5];
sides[4] = LCR_PHYSICS_UNIT / 2;
sides[5] = LCR_PHYSICS_UNIT / 2;
_CHECK_NEXT(TPE_envAATriPrism(point,TPE_vec3(0,0,0),sides,LCR_PHYSICS_UNIT / 2
,1));
point = vBest;
break;
}
#undef _CHECK_NEXT #undef _CHECK_NEXT
case LCR_BLOCK_RAMP_CORNER: case LCR_BLOCK_RAMP_CORNER:
@ -434,8 +468,6 @@ TPE_Vec3 _LCR_racingEnvironmentFunction(TPE_Vec3 point, TPE_Unit maxDist)
TPE_ENV_END TPE_ENV_END
} }
LCR_GameUnit LCR_racingGetCarSpeedUnsigned(void) LCR_GameUnit LCR_racingGetCarSpeedUnsigned(void)
{ {
return LCR_racing.carSpeed >= 0 ? LCR_racing.carSpeed : return LCR_racing.carSpeed >= 0 ? LCR_racing.carSpeed :

View file

@ -720,11 +720,25 @@ uint8_t _LCR_buildMapModel(void)
uint8_t blockMat = LCR_mapBlockGetMaterial(block); uint8_t blockMat = LCR_mapBlockGetMaterial(block);
#define VERT(n,c) LCR_renderer.mapVerts[3 * n + c] #define VERT(n,c) LCR_renderer.mapVerts[3 * n + c]
triData = triData =
(((VERT(triIndices[0],0) == VERT(triIndices[1],0)) && (((VERT(triIndices[0],0) == VERT(triIndices[1],0)) && // same X?
(VERT(triIndices[1],0) == VERT(triIndices[2],0))) << 4) | (VERT(triIndices[1],0) == VERT(triIndices[2],0))) << 4) |
(((VERT(triIndices[0],2) == VERT(triIndices[1],2)) && (((VERT(triIndices[0],2) == VERT(triIndices[1],2)) && // same Z?
(VERT(triIndices[1],2) == VERT(triIndices[2],2))) << 5); (VERT(triIndices[1],2) == VERT(triIndices[2],2))) << 5);
if (!(triData & 0xf0))
{
// diagonal walls
triData = (
(VERT(triIndices[0],0) == VERT(triIndices[1],0) &&
VERT(triIndices[0],2) == VERT(triIndices[1],2)) |
(VERT(triIndices[1],0) == VERT(triIndices[2],0) &&
VERT(triIndices[1],2) == VERT(triIndices[2],2)) |
(VERT(triIndices[0],0) == VERT(triIndices[2],0) &&
VERT(triIndices[0],2) == VERT(triIndices[2],2))) << 4;
}
#undef VERT #undef VERT
if (triData & 0xf0) // wall? if (triData & 0xf0) // wall?