Add possibility to move voxels/models via maphacks

# Conflicts:
#	source/build/src/engine.cpp
#	source/build/src/polymer.cpp
#	source/build/src/polymost.cpp
#	source/duke3d/src/lunatic/con_lang.lua
#	source/rr/src/lunatic/con_lang.lua
This commit is contained in:
CommonLoon102 2019-12-31 20:35:28 +01:00 committed by Christoph Oelckers
parent 95eb10d2a6
commit bc4a4bea23
9 changed files with 136 additions and 49 deletions

View file

@ -329,10 +329,11 @@ typedef struct {
uint32_t mdanimtims;
int16_t mdanimcur;
int16_t angoff, pitch, roll;
vec3_t offset;
vec3_t pivot_offset, position_offset;
uint8_t flags;
uint8_t xpanning, ypanning;
uint8_t filler;
uint32_t filler2;
float alpha;
// NOTE: keep 'tspr' on an 8-byte boundary:
tspriteptr_t tspr;

View file

@ -6108,13 +6108,17 @@ draw_as_face_sprite:
}
}
x = tspr->x + spriteext[spritenum].position_offset.x;
y = tspr->y + spriteext[spritenum].position_offset.y;
z = tspr->z + spriteext[spritenum].position_offset.z;
i = (int32_t)tspr->ang+1536;
i += spriteext[spritenum].angoff;
const int32_t ceilingz = (sec->ceilingstat&3) == 0 ? sec->ceilingz : INT32_MIN;
const int32_t floorz = (sec->floorstat&3) == 0 ? sec->floorz : INT32_MAX;
classicDrawVoxel(tspr->x,tspr->y,tspr->z,i,daxrepeat,(int32_t)tspr->yrepeat,vtilenum,
classicDrawVoxel(x,y,z,i,daxrepeat,(int32_t)tspr->yrepeat,vtilenum,
tspr->shade,tspr->pal,lwall.Data(),swall.Data(),tspr->cstat,(tspr->cstat&48)!=48,floorz,ceilingz);
}

View file

@ -1428,8 +1428,8 @@ void md3_vox_calcmat_common(tspriteptr_t tspr, const vec3f_t *a0, float f, float
float g;
float k0, k1, k2, k3, k4, k5, k6, k7;
k0 = ((float)(tspr->x-globalposx))*f*(1.f/1024.f);
k1 = ((float)(tspr->y-globalposy))*f*(1.f/1024.f);
k0 = ((float)(tspr->x+spriteext[tspr->owner].position_offset.x-globalposx))*f*(1.f/1024.f);
k1 = ((float)(tspr->y+spriteext[tspr->owner].position_offset.y-globalposy))*f*(1.f/1024.f);
f = gcosang2*gshang/gvrcorrection;
g = gsinang2*gshang/gvrcorrection;
k4 = (float)sintable[(tspr->ang+spriteext[tspr->owner].angoff+1024)&2047] * (1.f/16384.f);
@ -1521,7 +1521,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr)
a0.z = m->zadd * m->scale;
// Parkar: Moved up to be able to use k0 for the y-flipping code
k0 = (float)tspr->z;
k0 = (float)tspr->z+spriteext[tspr->owner].position_offset.z;
if ((globalorientation&128) && !((globalorientation&48)==32))
k0 += (float)(sizyrep<<1);
@ -1544,7 +1544,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr)
m0.z *= f; m1.z *= f; a0.z *= f;
// floor aligned
k1 = (float)tspr->y;
k1 = (float)tspr->y+spriteext[tspr->owner].position_offset.y;
if ((globalorientation&48)==32)
{
m0.z = -m0.z; m1.z = -m1.z; a0.z = -a0.z;
@ -1557,7 +1557,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr)
// calculations below again, but are needed for the base offsets.
f = (65536.f*512.f)/(fxdimen*fviewingrange);
g = 32.f/(fxdimen*gxyaspect);
m0.y *= f; m1.y *= f; a0.y = (((float)(tspr->x-globalposx))* (1.f/1024.f) + a0.y)*f;
m0.y *= f; m1.y *= f; a0.y = (((float)(tspr->x+spriteext[tspr->owner].position_offset.x-globalposx))* (1.f/1024.f) + a0.y)*f;
m0.x *=-f; m1.x *=-f; a0.x = ((k1 -fglobalposy) * -(1.f/1024.f) + a0.x)*-f;
m0.z *= g; m1.z *= g; a0.z = ((k0 -fglobalposz) * -(1.f/16384.f) + a0.z)*g;
@ -1623,14 +1623,14 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr)
float f = 1.f/(fxdimen * fviewingrange) * (256.f/(65536.f*128.f)) * (m0.x+m1.x);
Bmemset(&a0, 0, sizeof(a0));
if (sext->offset.x)
a0.x = (float) sext->offset.x * f;
if (sext->pivot_offset.x)
a0.x = (float) sext->pivot_offset.x * f;
if (sext->offset.y) // Compare with SCREEN_FACTORS above
a0.y = (float) sext->offset.y * f;
if (sext->pivot_offset.y) // Compare with SCREEN_FACTORS above
a0.y = (float) sext->pivot_offset.y * f;
if ((sext->offset.z) && !(tspr->clipdist & TSPR_FLAGS_MDHACK)) // Compare with SCREEN_FACTORS above
a0.z = (float)sext->offset.z / (gxyaspect * fxdimen * (65536.f/128.f) * (m0.z+m1.z));
if ((sext->pivot_offset.z) && !(tspr->clipdist & TSPR_FLAGS_MDHACK)) // Compare with SCREEN_FACTORS above
a0.z = (float)sext->pivot_offset.z / (gxyaspect * fxdimen * (65536.f/128.f) * (m0.z+m1.z));
k0 = (float)sintable[(sext->pitch+512)&2047] * (1.f/16384.f);
k1 = (float)sintable[sext->pitch&2047] * (1.f/16384.f);

View file

@ -46,9 +46,12 @@ int32_t engineLoadMHK(const char *filename)
T_NOANIM,
T_PITCH,
T_ROLL,
T_MDXOFF,
T_MDYOFF,
T_MDZOFF,
T_PIVOTXOFF,
T_PIVOTYOFF,
T_PIVOTZOFF,
T_POSITIONXOFF,
T_POSITIONYOFF,
T_POSITIONZOFF,
T_AWAY1,
T_AWAY2,
T_LIGHT,
@ -67,9 +70,21 @@ int32_t engineLoadMHK(const char *filename)
{ "nomdanim", T_NOANIM },
{ "pitch", T_PITCH },
{ "roll", T_ROLL },
{ "mdxoff", T_MDXOFF },
{ "mdyoff", T_MDYOFF },
{ "mdzoff", T_MDZOFF },
{ "mdxoff", T_PIVOTXOFF },
{ "mdyoff", T_PIVOTYOFF },
{ "mdzoff", T_PIVOTZOFF },
{ "pivxoff", T_PIVOTXOFF },
{ "pivyoff", T_PIVOTYOFF },
{ "pivzoff", T_PIVOTZOFF },
{ "pivotxoff", T_PIVOTXOFF },
{ "pivotyoff", T_PIVOTYOFF },
{ "pivotzoff", T_PIVOTZOFF },
{ "posxoff", T_POSITIONXOFF },
{ "posyoff", T_POSITIONYOFF },
{ "poszoff", T_POSITIONZOFF },
{ "positionxoff", T_POSITIONXOFF },
{ "positionyoff", T_POSITIONYOFF },
{ "positionzoff", T_POSITIONZOFF },
{ "away1", T_AWAY1 },
{ "away2", T_AWAY2 },
{ "light", T_LIGHT },
@ -197,7 +212,7 @@ int32_t engineLoadMHK(const char *filename)
spriteext[whichsprite].roll = (int16_t) roll;
}
break;
case T_MDXOFF: // mdxoff <xx>
case T_PIVOTXOFF: // pivxoff <xx>
{
int32_t i;
if (scriptfile_getnumber(script, &i)) break;
@ -205,14 +220,14 @@ int32_t engineLoadMHK(const char *filename)
if (whichsprite < 0)
{
// no sprite directive preceeding
initprintf("Ignoring mdxoff directive because of absent/invalid sprite number on line %s:%d\n",
initprintf("Ignoring mdxoff/pivxoff directive because of absent/invalid sprite number on line %s:%d\n",
script->filename, scriptfile_getlinum(script, cmdtokptr));
break;
}
spriteext[whichsprite].offset.x = i;
spriteext[whichsprite].pivot_offset.x = i;
}
break;
case T_MDYOFF: // mdyoff <xx>
case T_PIVOTYOFF: // pivyoff <xx>
{
int32_t i;
if (scriptfile_getnumber(script, &i)) break;
@ -220,14 +235,14 @@ int32_t engineLoadMHK(const char *filename)
if (whichsprite < 0)
{
// no sprite directive preceeding
initprintf("Ignoring mdyoff directive because of absent/invalid sprite number on line %s:%d\n",
initprintf("Ignoring mdyoff/pivyoff directive because of absent/invalid sprite number on line %s:%d\n",
script->filename, scriptfile_getlinum(script, cmdtokptr));
break;
}
spriteext[whichsprite].offset.y = i;
spriteext[whichsprite].pivot_offset.y = i;
}
break;
case T_MDZOFF: // mdzoff <xx>
case T_PIVOTZOFF: // pivzoff <xx>
{
int32_t i;
if (scriptfile_getnumber(script, &i)) break;
@ -235,11 +250,56 @@ int32_t engineLoadMHK(const char *filename)
if (whichsprite < 0)
{
// no sprite directive preceeding
initprintf("Ignoring mdzoff directive because of absent/invalid sprite number on line %s:%d\n",
initprintf("Ignoring mdzoff/pivzoff directive because of absent/invalid sprite number on line %s:%d\n",
script->filename, scriptfile_getlinum(script, cmdtokptr));
break;
}
spriteext[whichsprite].offset.z = i;
spriteext[whichsprite].pivot_offset.z = i;
}
break;
case T_POSITIONXOFF: // posxoff <xx>
{
int32_t i;
if (scriptfile_getnumber(script, &i)) break;
if (whichsprite < 0)
{
// no sprite directive preceeding
initprintf("Ignoring posxoff directive because of absent/invalid sprite number on line %s:%d\n",
script->filename, scriptfile_getlinum(script, cmdtokptr));
break;
}
spriteext[whichsprite].position_offset.x = i;
}
break;
case T_POSITIONYOFF: // posyoff <xx>
{
int32_t i;
if (scriptfile_getnumber(script, &i)) break;
if (whichsprite < 0)
{
// no sprite directive preceeding
initprintf("Ignoring posyoff directive because of absent/invalid sprite number on line %s:%d\n",
script->filename, scriptfile_getlinum(script, cmdtokptr));
break;
}
spriteext[whichsprite].position_offset.y = i;
}
break;
case T_POSITIONZOFF: // poszoff <xx>
{
int32_t i;
if (scriptfile_getnumber(script, &i)) break;
if (whichsprite < 0)
{
// no sprite directive preceeding
initprintf("Ignoring poszoff directive because of absent/invalid sprite number on line %s:%d\n",
script->filename, scriptfile_getlinum(script, cmdtokptr));
break;
}
spriteext[whichsprite].position_offset.z = i;
}
break;
case T_AWAY1: // away1

View file

@ -1035,7 +1035,7 @@ int32_t polymost_voxdraw(voxmodel_t *m, tspriteptr_t const tspr)
f = (float) tspr->yrepeat * k0;
m0.z *= f; a0.z *= f;
k0 = (float) tspr->z;
k0 = (float) (tspr->z+spriteext[tspr->owner].position_offset.z);
f = ((globalorientation&8) && (sprite[tspr->owner].cstat&48)!=0) ? -4.f : 4.f;
k0 -= (tspr->yoffset*tspr->yrepeat)*f*m->bscale;
zoff = m->siz.z*.5f;
@ -1053,8 +1053,8 @@ int32_t polymost_voxdraw(voxmodel_t *m, tspriteptr_t const tspr)
int const shadowHack = !!(tspr->clipdist & TSPR_FLAGS_MDHACK);
m0.y *= f; a0.y = (((float)(tspr->x-globalposx)) * (1.f/1024.f) + a0.y) * f;
m0.x *=-f; a0.x = (((float)(tspr->y-globalposy)) * -(1.f/1024.f) + a0.x) * -f;
m0.y *= f; a0.y = (((float)(tspr->x+spriteext[tspr->owner].position_offset.x-globalposx)) * (1.f/1024.f) + a0.y) * f;
m0.x *=-f; a0.x = (((float)(tspr->y+spriteext[tspr->owner].position_offset.y-globalposy)) * -(1.f/1024.f) + a0.x) * -f;
m0.z *= g; a0.z = (((float)(k0 -globalposz - shadowHack)) * -(1.f/16384.f) + a0.z) * g;
float mat[16];

View file

@ -315,9 +315,13 @@ typedef struct netactor_s
ext_pitch,
ext_roll,
ext_offset_x,
ext_offset_y,
ext_offset_z,
ext_pivot_offset_x,
ext_pivot_offset_y,
ext_pivot_offset_z,
ext_position_offset_x,
ext_position_offset_y,
ext_position_offset_z,
ext_flags,
ext_xpanning,

View file

@ -737,9 +737,12 @@ enum ActorLabel_t
ACTOR_ANGOFF = ACTOR_SPRITEEXT_BEGIN,
ACTOR_PITCH,
ACTOR_ROLL,
ACTOR_MDXOFF,
ACTOR_MDYOFF,
ACTOR_MDZOFF,
ACTOR_PIVOTXOFF,
ACTOR_PIVOTYOFF,
ACTOR_PIVOTZOFF,
ACTOR_POSITIONXOFF,
ACTOR_POSITIONYOFF,
ACTOR_POSITIONZOFF,
ACTOR_MDFLAGS,
ACTOR_XPANNING,
ACTOR_YPANNING,

View file

@ -305,9 +305,12 @@ const memberlabel_t ActorLabels[]=
LABEL_SETUP(spriteext, pitch, ACTOR_PITCH),
LABEL_SETUP(spriteext, roll, ACTOR_ROLL),
LABEL_SETUP_UNMATCHED(spriteext, offset.x, "mdxoff", ACTOR_MDXOFF),
LABEL_SETUP_UNMATCHED(spriteext, offset.y, "mdyoff", ACTOR_MDYOFF),
LABEL_SETUP_UNMATCHED(spriteext, offset.z, "mdzoff", ACTOR_MDZOFF),
LABEL_SETUP_UNMATCHED(spriteext, pivot_offset.x, "mdxoff", ACTOR_PIVOTXOFF),
LABEL_SETUP_UNMATCHED(spriteext, pivot_offset.y, "mdyoff", ACTOR_PIVOTYOFF),
LABEL_SETUP_UNMATCHED(spriteext, pivot_offset.z, "mdzoff", ACTOR_PIVOTZOFF),
LABEL_SETUP_UNMATCHED(spriteext, position_offset.x, "posxoff", ACTOR_POSITIONXOFF),
LABEL_SETUP_UNMATCHED(spriteext, position_offset.y, "posyoff", ACTOR_POSITIONYOFF),
LABEL_SETUP_UNMATCHED(spriteext, position_offset.z, "poszoff", ACTOR_POSITIONZOFF),
LABEL_SETUP_UNMATCHED(spriteext, flags, "mdflags", ACTOR_MDFLAGS),
LABEL_SETUP(spriteext, xpanning, ACTOR_XPANNING),

View file

@ -402,9 +402,13 @@ static netField_t ActorFields[] =
{ ACTF(ext_pitch), 16 },
{ ACTF(ext_roll), 16 },
{ ACTF(ext_offset_x), 32 },
{ ACTF(ext_offset_y), 32 },
{ ACTF(ext_offset_z), 32 },
{ ACTF(ext_pivot_offset_x), 32 },
{ ACTF(ext_pivot_offset_y), 32 },
{ ACTF(ext_pivot_offset_z), 32 },
{ ACTF(ext_position_offset_x), 32 },
{ ACTF(ext_position_offset_y), 32 },
{ ACTF(ext_position_offset_z), 32 },
{ ACTF(ext_flags), 8 },
{ ACTF(ext_xpanning), 8 },
@ -1020,9 +1024,13 @@ static void Net_CopySpriteExtFromNet(const netactor_t* netActor, spriteext_t* ga
gameSprExt->pitch = netActor->ext_pitch;
gameSprExt->roll = netActor->ext_roll;
gameSprExt->offset.x = netActor->ext_offset_x;
gameSprExt->offset.y = netActor->ext_offset_y;
gameSprExt->offset.z = netActor->ext_offset_z;
gameSprExt->pivot_offset.x = netActor->ext_pivot_offset_x;
gameSprExt->pivot_offset.y = netActor->ext_pivot_offset_y;
gameSprExt->pivot_offset.z = netActor->ext_pivot_offset_z;
gameSprExt->position_offset.x = netActor->ext_position_offset_x;
gameSprExt->position_offset.y = netActor->ext_position_offset_y;
gameSprExt->position_offset.z = netActor->ext_position_offset_z;
gameSprExt->flags = netActor->ext_flags;
gameSprExt->xpanning = netActor->ext_xpanning;
@ -1375,9 +1383,13 @@ static void Net_CopySpriteExtToNet(const spriteext_t* gameSpriteExt, netactor_t*
netActor->ext_pitch = gameSpriteExt->pitch;
netActor->ext_roll = gameSpriteExt->roll;
netActor->ext_offset_x = gameSpriteExt->offset.x;
netActor->ext_offset_y = gameSpriteExt->offset.y;
netActor->ext_offset_z = gameSpriteExt->offset.z;
netActor->ext_pivot_offset_x = gameSpriteExt->pivot_offset.x;
netActor->ext_pivot_offset_y = gameSpriteExt->pivot_offset.y;
netActor->ext_pivot_offset_z = gameSpriteExt->pivot_offset.z;
netActor->ext_position_offset_x = gameSpriteExt->position_offset.x;
netActor->ext_position_offset_y = gameSpriteExt->position_offset.y;
netActor->ext_position_offset_z = gameSpriteExt->position_offset.z;
netActor->ext_flags = gameSpriteExt->flags;
netActor->ext_xpanning = gameSpriteExt->xpanning;