Skip to content

Commit

Permalink
Add PitchOffset and RollOffset to voxels
Browse files Browse the repository at this point in the history
  • Loading branch information
nashmuhandes committed Feb 3, 2025
1 parent ec42c77 commit 9e6d3a2
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/common/models/voxels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,8 @@ FVoxelDef *R_LoadVoxelDef(int lumpnum, int spin)
voxdef->Scale = 1.;
voxdef->DroppedSpin = voxdef->PlacedSpin = spin;
voxdef->AngleOffset = DAngle::fromDeg(90.);
voxdef->PitchOffset = nullAngle;
voxdef->RollOffset = nullAngle;

Voxels.Push(vox);
VoxelDefs.Push(voxdef);
Expand Down
2 changes: 2 additions & 0 deletions src/common/models/voxels.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ struct FVoxelDef
int VoxeldefIndex; // Needed by GZDoom
double Scale;
DAngle AngleOffset;// added to actor's angle to compensate for wrong-facing voxels
DAngle PitchOffset;
DAngle RollOffset;
double xoffset;
double yoffset;
double zoffset;
Expand Down
28 changes: 23 additions & 5 deletions src/r_data/models.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,16 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod

// 5) Applying model rotations.
objectToWorldMatrix.rotate(-smf->angleoffset, 0, 1, 0);
objectToWorldMatrix.rotate(smf->pitchoffset, 0, 0, 1);
objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0);
if (!smf->isVoxel)
{
objectToWorldMatrix.rotate(smf->pitchoffset, 0, 0, 1);
objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0);
}
else
{
objectToWorldMatrix.rotate(-smf->pitchoffset, 1, 0, 0);
objectToWorldMatrix.rotate(smf->rolloffset, 0, 0, 1);
}

if (!(smf_flags & MDL_CORRECTPIXELSTRETCH))
{
Expand Down Expand Up @@ -247,8 +255,16 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, FVector3 translatio

// Applying angleoffset, pitchoffset, rolloffset.
objectToWorldMatrix.rotate(-smf->angleoffset, 0, 1, 0);
objectToWorldMatrix.rotate(smf->pitchoffset, 0, 0, 1);
objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0);
if (!smf->isVoxel)
{
objectToWorldMatrix.rotate(smf->pitchoffset, 0, 0, 1);
objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0);
}
else
{
objectToWorldMatrix.rotate(-smf->pitchoffset, 1, 0, 0);
objectToWorldMatrix.rotate(smf->rolloffset, 0, 0, 1);
}

float orientation = smf->xscale * smf->yscale * smf->zscale;

Expand Down Expand Up @@ -602,11 +618,13 @@ void InitModels()
smf.animationIDs[0] = -1;
smf.xscale = smf.yscale = smf.zscale = VoxelDefs[i]->Scale;
smf.angleoffset = VoxelDefs[i]->AngleOffset.Degrees();
smf.pitchoffset = VoxelDefs[i]->PitchOffset.Degrees();
smf.rolloffset = VoxelDefs[i]->RollOffset.Degrees();
smf.xoffset = VoxelDefs[i]->xoffset;
smf.yoffset = VoxelDefs[i]->yoffset;
smf.zoffset = VoxelDefs[i]->zoffset;
// this helps catching uninitialized data.
assert(VoxelDefs[i]->PitchFromMomentum == true || VoxelDefs[i]->PitchFromMomentum == false);
//assert(VoxelDefs[i]->PitchFromMomentum == true || VoxelDefs[i]->PitchFromMomentum == false);
if (VoxelDefs[i]->PitchFromMomentum) smf.flags |= MDL_PITCHFROMMOMENTUM;
if (VoxelDefs[i]->UseActorPitch) smf.flags |= MDL_USEACTORPITCH;
if (VoxelDefs[i]->UseActorRoll) smf.flags |= MDL_USEACTORROLL;
Expand Down
36 changes: 36 additions & 0 deletions src/r_data/voxeldef.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ struct VoxelOptions
int PlacedSpin = 0;
double Scale = 1;
DAngle AngleOffset = DAngle90;
DAngle PitchOffset = nullAngle;
DAngle RollOffset = nullAngle;
double xoffset = 0.0;
double yoffset = 0.0;
double zoffset = 0.0;
Expand Down Expand Up @@ -180,6 +182,38 @@ static void VOX_ReadOptions(FScanner &sc, VoxelOptions &opts)
}
opts.AngleOffset = DAngle::fromDeg(mul * sc.Float + 90.);
}
else if (sc.Compare("pitchoffset"))
{
int mul = 1;
sc.MustGetToken('=');
if (sc.CheckToken('-')) mul = -1;
sc.MustGetAnyToken();
if (sc.TokenType == TK_IntConst)
{
sc.Float = sc.Number;
}
else
{
sc.TokenMustBe(TK_FloatConst);
}
opts.PitchOffset = DAngle::fromDeg(mul * sc.Float);
}
else if (sc.Compare("rolloffset"))
{
int mul = 1;
sc.MustGetToken('=');
if (sc.CheckToken('-')) mul = -1;
sc.MustGetAnyToken();
if (sc.TokenType == TK_IntConst)
{
sc.Float = sc.Number;
}
else
{
sc.TokenMustBe(TK_FloatConst);
}
opts.RollOffset = DAngle::fromDeg(mul * sc.Float);
}
else if (sc.Compare("xoffset"))
{
int mul = 1;
Expand Down Expand Up @@ -313,6 +347,8 @@ void R_InitVoxels()
def->DroppedSpin = opts.DroppedSpin;
def->PlacedSpin = opts.PlacedSpin;
def->AngleOffset = opts.AngleOffset;
def->PitchOffset = opts.PitchOffset;
def->RollOffset = opts.RollOffset;
def->xoffset = opts.xoffset;
def->yoffset = opts.yoffset;
def->zoffset = opts.zoffset;
Expand Down

0 comments on commit 9e6d3a2

Please sign in to comment.