mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-27 04:21:47 +00:00
You can now link terrain to textures
This commit is contained in:
parent
f6c42f70a7
commit
595d568b53
2 changed files with 119 additions and 30 deletions
128
src/k_terrain.c
128
src/k_terrain.c
|
|
@ -34,6 +34,9 @@ UINT16 numFootstepDefs = 0;
|
||||||
terrain_t *terrainDefs = NULL;
|
terrain_t *terrainDefs = NULL;
|
||||||
UINT16 numTerrainDefs = 0;
|
UINT16 numTerrainDefs = 0;
|
||||||
|
|
||||||
|
t_floor_t *terrainFloorDefs = NULL;
|
||||||
|
UINT16 numTerrainFloorDefs = 0;
|
||||||
|
|
||||||
UINT16 defaultTerrain = UINT16_MAX;
|
UINT16 defaultTerrain = UINT16_MAX;
|
||||||
|
|
||||||
terrain_t *K_GetTerrainByIndex(UINT16 checkIndex)
|
terrain_t *K_GetTerrainByIndex(UINT16 checkIndex)
|
||||||
|
|
@ -76,16 +79,11 @@ terrain_t *K_GetDefaultTerrain(void)
|
||||||
return K_GetTerrainByIndex(defaultTerrain);
|
return K_GetTerrainByIndex(defaultTerrain);
|
||||||
}
|
}
|
||||||
|
|
||||||
terrain_t *K_GetTerrainForTextureNum(INT32 textureNum)
|
terrain_t *K_GetTerrainForTextureName(const char *checkName)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
if (textureNum == -1)
|
if (numTerrainFloorDefs == 0)
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numTerrainDefs == 0)
|
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -93,24 +91,13 @@ terrain_t *K_GetTerrainForTextureNum(INT32 textureNum)
|
||||||
// Search backwards through all terrain definitions.
|
// Search backwards through all terrain definitions.
|
||||||
// The latest one will have priority over the older one.
|
// The latest one will have priority over the older one.
|
||||||
|
|
||||||
for (i = numTerrainDefs-1; i >= 0; i--)
|
for (i = 0; i < numTerrainFloorDefs; i++)
|
||||||
{
|
{
|
||||||
terrain_t *t = &terrainDefs[i];
|
t_floor_t *f = &terrainFloorDefs[i];
|
||||||
size_t j;
|
|
||||||
|
|
||||||
if (t->numTextureIDs == 0)
|
if (stricmp(checkName, f->textureName) == 0)
|
||||||
{
|
{
|
||||||
// No textures are applied to this terrain type.
|
return K_GetTerrainByIndex(f->terrainID);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < t->numTextureIDs; j++)
|
|
||||||
{
|
|
||||||
if (textureNum == t->textureIDs[j])
|
|
||||||
{
|
|
||||||
// Texture matches.
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -119,9 +106,17 @@ terrain_t *K_GetTerrainForTextureNum(INT32 textureNum)
|
||||||
return K_GetDefaultTerrain();
|
return K_GetDefaultTerrain();
|
||||||
}
|
}
|
||||||
|
|
||||||
terrain_t *K_GetTerrainForTextureName(const char *checkName)
|
terrain_t *K_GetTerrainForTextureNum(INT32 textureNum)
|
||||||
{
|
{
|
||||||
return K_GetTerrainForTextureNum( R_CheckTextureNumForName(checkName) );
|
texture_t *tex = NULL;
|
||||||
|
|
||||||
|
if (textureNum < 0 || textureNum >= numtextures)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tex = textures[textureNum];
|
||||||
|
return K_GetTerrainForTextureName(tex->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void K_UpdateMobjTerrain(mobj_t *mo, INT32 flatID)
|
void K_UpdateMobjTerrain(mobj_t *mo, INT32 flatID)
|
||||||
|
|
@ -278,6 +273,12 @@ static void K_ParseTerrainParameter(UINT32 i, char *param, char *val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void K_NewTerrainFloorDefs(void)
|
||||||
|
{
|
||||||
|
numTerrainFloorDefs++;
|
||||||
|
terrainFloorDefs = (t_floor_t *)Z_Realloc(terrainFloorDefs, sizeof(t_floor_t) * (numTerrainFloorDefs + 1), PU_STATIC, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static boolean K_DoTERRAINLumpParse(size_t num, void (*parser)(UINT32, char *, char *))
|
static boolean K_DoTERRAINLumpParse(size_t num, void (*parser)(UINT32, char *, char *))
|
||||||
{
|
{
|
||||||
char *param, *val;
|
char *param, *val;
|
||||||
|
|
@ -361,13 +362,88 @@ static boolean K_TERRAINLumpParser(UINT8 *data, size_t size)
|
||||||
|
|
||||||
valid = K_DoTERRAINLumpParse(i, K_ParseTerrainParameter);
|
valid = K_DoTERRAINLumpParse(i, K_ParseTerrainParameter);
|
||||||
}
|
}
|
||||||
// TODO: the other block types!
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, "No terrain type name.\n");
|
CONS_Alert(CONS_ERROR, "No terrain type name.\n");
|
||||||
valid = false;
|
valid = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (stricmp(tkn, "floor") == 0)
|
||||||
|
{
|
||||||
|
Z_Free(tkn);
|
||||||
|
tkn = M_GetToken(NULL);
|
||||||
|
pos = M_GetTokenPos();
|
||||||
|
|
||||||
|
if (tkn && pos < size)
|
||||||
|
{
|
||||||
|
if (stricmp(tkn, "optional") == 0)
|
||||||
|
{
|
||||||
|
// "optional" is ZDoom syntax
|
||||||
|
// We don't use it, but we can ignore it.
|
||||||
|
Z_Free(tkn);
|
||||||
|
tkn = M_GetToken(NULL);
|
||||||
|
pos = M_GetTokenPos();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tkn && pos < size)
|
||||||
|
{
|
||||||
|
t_floor_t *f = NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < numTerrainFloorDefs; i++)
|
||||||
|
{
|
||||||
|
f = &terrainFloorDefs[i];
|
||||||
|
|
||||||
|
if (stricmp(tkn, f->textureName) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == numTerrainFloorDefs)
|
||||||
|
{
|
||||||
|
K_NewTerrainFloorDefs();
|
||||||
|
f = &terrainFloorDefs[i];
|
||||||
|
|
||||||
|
strncpy(f->textureName, tkn, 9);
|
||||||
|
}
|
||||||
|
|
||||||
|
Z_Free(tkn);
|
||||||
|
tkn = M_GetToken(NULL);
|
||||||
|
pos = M_GetTokenPos();
|
||||||
|
|
||||||
|
if (tkn && pos < size)
|
||||||
|
{
|
||||||
|
terrain_t *t = K_GetTerrainByName(tkn);
|
||||||
|
|
||||||
|
if (t == NULL)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, "Invalid Terrain type '%s'.\n", tkn);
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
f->terrainID = (t - terrainDefs);
|
||||||
|
CONS_Printf("Texture '%s' set to Terrain '%s'\n", f->textureName, tkn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, "No terrain for floor definition.\n");
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, "No texture for floor definition.\n");
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, "No texture for floor definition.\n");
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (stricmp(tkn, "defaultTerrain") == 0)
|
else if (stricmp(tkn, "defaultTerrain") == 0)
|
||||||
{
|
{
|
||||||
Z_Free(tkn);
|
Z_Free(tkn);
|
||||||
|
|
@ -398,13 +474,13 @@ static boolean K_TERRAINLumpParser(UINT8 *data, size_t size)
|
||||||
defaultTerrain = i;
|
defaultTerrain = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: the other block types!
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, "No DefaultTerrain type.\n");
|
CONS_Alert(CONS_ERROR, "No DefaultTerrain type.\n");
|
||||||
valid = false;
|
valid = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO: splash & footstep blocks
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, "Unknown field '%s' found in TERRAIN lump.\n", tkn);
|
CONS_Alert(CONS_ERROR, "Unknown field '%s' found in TERRAIN lump.\n", tkn);
|
||||||
|
|
|
||||||
|
|
@ -58,9 +58,6 @@ typedef struct terrain_s
|
||||||
|
|
||||||
char name[TERRAIN_NAME_LEN]; // Lookup name.
|
char name[TERRAIN_NAME_LEN]; // Lookup name.
|
||||||
|
|
||||||
INT32 *textureIDs; // Texture nums this terrain applies to. (Doesn't support flats, stop using them already.)
|
|
||||||
UINT32 numTextureIDs; // Length of the above table.
|
|
||||||
|
|
||||||
UINT16 splashID; // Splash defintion ID.
|
UINT16 splashID; // Splash defintion ID.
|
||||||
UINT16 footstepID; // Footstep defintion ID.
|
UINT16 footstepID; // Footstep defintion ID.
|
||||||
|
|
||||||
|
|
@ -71,6 +68,19 @@ typedef struct terrain_s
|
||||||
UINT32 flags; // Flag values (see: terrain_flags_t)
|
UINT32 flags; // Flag values (see: terrain_flags_t)
|
||||||
} terrain_t;
|
} terrain_t;
|
||||||
|
|
||||||
|
typedef struct t_floor_s
|
||||||
|
{
|
||||||
|
// Terrain floor definition.
|
||||||
|
// Ties texture names to a .
|
||||||
|
|
||||||
|
// (Could be optimized by using texture IDs instead of names,
|
||||||
|
// but was concerned because I recall sooomething about those not being netsafe?
|
||||||
|
// Someone confirm if I just hallucinated that. :V)
|
||||||
|
|
||||||
|
char textureName[9]; // Floor texture name.
|
||||||
|
UINT16 terrainID; // Terrain definition ID.
|
||||||
|
} t_floor_t;
|
||||||
|
|
||||||
// Arrays for all terrain definitions.
|
// Arrays for all terrain definitions.
|
||||||
extern t_splash_t *splashDefs;
|
extern t_splash_t *splashDefs;
|
||||||
extern UINT16 numSplashDefs;
|
extern UINT16 numSplashDefs;
|
||||||
|
|
@ -81,14 +91,17 @@ extern UINT16 numFootstepDefs;
|
||||||
extern terrain_t *terrainDefs;
|
extern terrain_t *terrainDefs;
|
||||||
extern UINT16 numTerrainDefs;
|
extern UINT16 numTerrainDefs;
|
||||||
|
|
||||||
|
extern t_floor_t *terrainFloorDefs;
|
||||||
|
extern UINT16 numTerrainFloorDefs;
|
||||||
|
|
||||||
// Default terrain definition ID.
|
// Default terrain definition ID.
|
||||||
extern UINT16 defaultTerrain;
|
extern UINT16 defaultTerrain;
|
||||||
|
|
||||||
terrain_t *K_GetTerrainByIndex(UINT16 checkIndex);
|
terrain_t *K_GetTerrainByIndex(UINT16 checkIndex);
|
||||||
terrain_t *K_GetTerrainByName(const char *checkName);
|
terrain_t *K_GetTerrainByName(const char *checkName);
|
||||||
terrain_t *K_GetDefaultTerrain(void);
|
terrain_t *K_GetDefaultTerrain(void);
|
||||||
terrain_t *K_GetTerrainForTextureNum(INT32 textureNum);
|
|
||||||
terrain_t *K_GetTerrainForTextureName(const char *checkName);
|
terrain_t *K_GetTerrainForTextureName(const char *checkName);
|
||||||
|
terrain_t *K_GetTerrainForTextureNum(INT32 textureNum);
|
||||||
|
|
||||||
void K_UpdateMobjTerrain(mobj_t *mo, INT32 flatID);
|
void K_UpdateMobjTerrain(mobj_t *mo, INT32 flatID);
|
||||||
void K_SetDefaultFriction(mobj_t *mo);
|
void K_SetDefaultFriction(mobj_t *mo);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue