diff --git a/assets.h b/assets.h index 02af77d..d64c6d5 100644 --- a/assets.h +++ b/assets.h @@ -44,6 +44,8 @@ LCR_MAP_BLOCK(LCR_BLOCK_CUBOID_FILL,10,2,1,0,0), LCR_MAP_BLOCK(LCR_BLOCK_LEFT,9,0,20,LCR_BLOCK_MATERIAL_CONCRETE,0), LCR_MAP_BLOCK(LCR_BLOCK_CUBOID_FILL,8,1,8,0,0), +LCR_MAP_BLOCK(LCR_BLOCK_RAMP_CURVED_WALL,3,4,4,LCR_BLOCK_MATERIAL_CONCRETE,0), + /* LCR_MAP_BLOCK(LCR_BLOCK_FULL,15,0,0,LCR_BLOCK_MATERIAL_GRASS,0), LCR_MAP_BLOCK(LCR_BLOCK_CUBOID_FILL,10,1,15,0,0), diff --git a/map.h b/map.h index d8cc7ce..093eacb 100644 --- a/map.h +++ b/map.h @@ -552,24 +552,33 @@ void LCR_mapGetBlockShape(uint8_t blockType, uint8_t transform, break; } + case LCR_BLOCK_RAMP_CURVED_PLAT: + ADD(0,0,6) ADD(0,4,5) ADD(0,4,6) // left + ADD(6,0,6) ADD(6,4,6) ADD(6,4,5) // right + ADD(0,4,5) ADD(6,4,5) ADD(0,4,6) // top + ADD(0,4,6) ADD(6,4,5) ADD(6,4,6) case LCR_BLOCK_RAMP_CURVED: - ADD(0,0,0) ADD(6,0,0) ADD(0,1,4) // ramp - ADD(0,1,4) ADD(6,0,0) ADD(6,1,4) - ADD(0,1,4) ADD(6,1,4) ADD(0,2,5) // ramp - ADD(0,2,5) ADD(6,1,4) ADD(6,2,5) - ADD(0,2,5) ADD(6,2,5) ADD(0,4,6) // ramp - ADD(0,4,6) ADD(6,2,5) ADD(6,4,6) - ADD(0,0,0) ADD(0,1,4) ADD(0,0,6) // left - ADD(0,0,6) ADD(0,1,4) ADD(0,2,5) - ADD(0,0,6) ADD(0,2,5) ADD(0,4,6) - ADD(6,0,0) ADD(6,0,6) ADD(6,1,4) // right - ADD(6,0,6) ADD(6,2,5) ADD(6,1,4) - ADD(6,0,6) ADD(6,4,6) ADD(6,2,5) - ADD(0,0,6) ADD(0,4,6) ADD(6,0,6) // back - ADD(6,0,6) ADD(0,4,6) ADD(6,4,6) - ADD(0,0,0) ADD(6,0,6) ADD(6,0,0) // bottom - ADD(0,0,0) ADD(0,0,6) ADD(6,0,6) + { + uint8_t plusZ = blockType == LCR_BLOCK_RAMP_CURVED; + + ADD(0,0,0) ADD(6,0,0) ADD(0,1,3 + plusZ) // ramp + ADD(0,1,3 + plusZ) ADD(6,0,0) ADD(6,1,3 + plusZ) + ADD(0,1,3 + plusZ) ADD(6,1,3 + plusZ) ADD(0,2,4 + plusZ) // ramp + ADD(0,2,4 + plusZ) ADD(6,1,3 + plusZ) ADD(6,2,4 + plusZ) + ADD(0,2,4 + plusZ) ADD(6,2,4 + plusZ) ADD(0,4,5 + plusZ) // ramp + ADD(0,4,5 + plusZ) ADD(6,2,4 + plusZ) ADD(6,4,5 + plusZ) + ADD(0,0,0) ADD(0,1,3 + plusZ) ADD(0,0,6) // left + ADD(0,0,6) ADD(0,1,3 + plusZ) ADD(0,2,4 + plusZ) + ADD(0,0,6) ADD(0,2,4 + plusZ) ADD(0,4,5 + plusZ) + ADD(6,0,0) ADD(6,0,6) ADD(6,1,3 + plusZ) // right + ADD(6,0,6) ADD(6,2,4 + plusZ) ADD(6,1,3 + plusZ) + ADD(6,0,6) ADD(6,4,5 + plusZ) ADD(6,2,4 + plusZ) + ADD(0,0,6) ADD(0,4,6) ADD(6,0,6) // back + ADD(6,0,6) ADD(0,4,6) ADD(6,4,6) + ADD(0,0,0) ADD(6,0,6) ADD(6,0,0) // bottom + ADD(0,0,0) ADD(0,0,6) ADD(6,0,6) break; + } case LCR_BLOCK_RAMP_CURVED_WALL: ADD(0,0,0) ADD(5,0,0) ADD(0,1,3) // ramp diff --git a/racing.h b/racing.h index cd27ab2..291cdf1 100644 --- a/racing.h +++ b/racing.h @@ -67,6 +67,9 @@ TPE_Vec3 _LCR_TPE_vec3DividePlain(TPE_Vec3 v, TPE_Unit d) TPE_Vec3 _LCR_racingBlockEnvFunc(TPE_Vec3 point, const uint8_t *block) { + TPE_Vec3 v, vBest; + TPE_Unit d, dBest = TPE_INFINITY; + uint8_t bx, by, bz; LCR_mapBlockGetCoords(block,&bx,&by,&bz); @@ -127,45 +130,59 @@ TPE_Vec3 _LCR_racingBlockEnvFunc(TPE_Vec3 point, const uint8_t *block) break; } +#define _CHECK_NEXT(check)\ + v = check;\ + d = TPE_dist(point,v);\ + if (d < dBest) {\ + vBest = v;\ + dBest = d;}\ + if (dBest == 0) {\ + point = vBest;\ + break;} + + case LCR_BLOCK_RAMP_CURVED_WALL: + _CHECK_NEXT(TPE_envAABox(point,TPE_vec3(5 * LCR_PHYSICS_UNIT / 12,0,0), + TPE_vec3(LCR_PHYSICS_UNIT / 12,LCR_PHYSICS_UNIT / 4,LCR_PHYSICS_UNIT + / 2))); + + case LCR_BLOCK_RAMP_CURVED_PLAT: + _CHECK_NEXT(TPE_envAABox(point,TPE_vec3(0,0,5 * LCR_PHYSICS_UNIT / 12), + TPE_vec3(LCR_PHYSICS_UNIT / 2,LCR_PHYSICS_UNIT / 4,LCR_PHYSICS_UNIT / 12 + ))); + case LCR_BLOCK_RAMP_CURVED: { - TPE_Vec3 v, vBest; - TPE_Unit sides[6], d, dBest; + TPE_Unit sides[6]; + TPE_Unit rampShift = block[0] != LCR_BLOCK_RAMP_CURVED ? + LCR_PHYSICS_UNIT / 6 : 0; - sides[0] = LCR_PHYSICS_UNIT / 8; + sides[0] = LCR_PHYSICS_UNIT / 8 - rampShift; sides[1] = -1 * LCR_PHYSICS_UNIT / 4; - sides[2] = LCR_PHYSICS_UNIT / 2; + sides[2] = LCR_PHYSICS_UNIT / 2 - rampShift; sides[3] = -1 * LCR_PHYSICS_UNIT / 4; - sides[4] = LCR_PHYSICS_UNIT / 2; + sides[4] = LCR_PHYSICS_UNIT / 2 - rampShift; sides[5] = LCR_PHYSICS_UNIT / 4; - vBest = TPE_envAATriPrism(point,TPE_vec3(0,0,0),sides,LCR_PHYSICS_UNIT,2); - dBest = TPE_dist(point,vBest); + _CHECK_NEXT(TPE_envAATriPrism(point, + TPE_vec3(0,0,0),sides,LCR_PHYSICS_UNIT,2)) - if (dBest != 0) - { - sides[0] = -1 * LCR_PHYSICS_UNIT / 4; - sides[1] = -1 * LCR_PHYSICS_UNIT / 4; - sides[2] = LCR_PHYSICS_UNIT / 2; - sides[3] = -1 * LCR_PHYSICS_UNIT / 4; - sides[4] = LCR_PHYSICS_UNIT / 2; - sides[5] = 0; + sides[0] = -1 * LCR_PHYSICS_UNIT / 2; + sides[1] = -1 * LCR_PHYSICS_UNIT / 4; + sides[2] = LCR_PHYSICS_UNIT / 2 - rampShift; + sides[3] = -1 * LCR_PHYSICS_UNIT / 4; + sides[4] = LCR_PHYSICS_UNIT / 2 - rampShift; + sides[5] = 0; - v = TPE_envAATriPrism(point,TPE_vec3(0,0,0),sides,LCR_PHYSICS_UNIT,2); - d = TPE_dist(point,v); - - if (d < dBest) - { - vBest = v; - dBest = d; - } - } + _CHECK_NEXT(TPE_envAATriPrism(point,TPE_vec3(0,0,0),sides,LCR_PHYSICS_UNIT + ,2)); point = vBest; break; } +#undef _CHECK_NEXT + case LCR_BLOCK_RAMP: case LCR_BLOCK_RAMP_34: case LCR_BLOCK_RAMP_12: