Fixed a nullptr crash with flatsprite actors.

This commit is contained in:
MajorCooke 2016-07-21 13:12:12 -05:00
parent dd962798a5
commit 35666f1e09

View file

@ -270,7 +270,7 @@ void GLSprite::Draw(int pass)
const bool drawBillboardFacingCamera = gl_billboard_faces_camera; const bool drawBillboardFacingCamera = gl_billboard_faces_camera;
// [Nash] has +ROLLSPRITE // [Nash] has +ROLLSPRITE
const bool drawRollSpriteActor = (actor != NULL && actor->renderflags & RF_ROLLSPRITE); const bool drawRollSpriteActor = (actor != nullptr && actor->renderflags & RF_ROLLSPRITE);
gl_RenderState.Apply(); gl_RenderState.Apply();
FVector3 v1; FVector3 v1;
@ -280,10 +280,10 @@ void GLSprite::Draw(int pass)
// [fgsfds] check sprite type mask // [fgsfds] check sprite type mask
DWORD spritetype = (DWORD)-1; DWORD spritetype = (DWORD)-1;
if (actor != NULL) spritetype = actor->renderflags & RF_SPRITETYPEMASK; if (actor != nullptr) spritetype = actor->renderflags & RF_SPRITETYPEMASK;
// [Nash] is a flat sprite // [Nash] is a flat sprite
const bool isFlatSprite = (actor != NULL) && (spritetype == RF_WALLSPRITE || spritetype == RF_FLATSPRITE); const bool isFlatSprite = (actor != nullptr) && (spritetype == RF_WALLSPRITE || spritetype == RF_FLATSPRITE);
const bool dontFlip = (actor != nullptr) && (actor->renderflags & RF_DONTFLIP); const bool dontFlip = (actor != nullptr) && (actor->renderflags & RF_DONTFLIP);
const bool useOffsets = (actor != nullptr) && !(actor->renderflags & RF_ROLLCENTER); const bool useOffsets = (actor != nullptr) && !(actor->renderflags & RF_ROLLCENTER);
@ -295,8 +295,8 @@ void GLSprite::Draw(int pass)
float ycenter = (y1 + y2)*0.5; float ycenter = (y1 + y2)*0.5;
float zcenter = (z1 + z2)*0.5; float zcenter = (z1 + z2)*0.5;
float xx = -xcenter + x; float xx = -xcenter + x;
float yy = -zcenter + z; float zz = -zcenter + z;
float zz = -ycenter + y; float yy = -ycenter + y;
Matrix3x4 mat; Matrix3x4 mat;
mat.MakeIdentity(); mat.MakeIdentity();
mat.Translate(xcenter, zcenter, ycenter); // move to sprite center mat.Translate(xcenter, zcenter, ycenter); // move to sprite center
@ -336,20 +336,22 @@ void GLSprite::Draw(int pass)
// Here we need some form of priority in order to work. // Here we need some form of priority in order to work.
if (spritetype == RF_FLATSPRITE) if (spritetype == RF_FLATSPRITE)
{ {
DVector3 diff = actor->Vec3To(GLRenderer->mViewActor); float pitchDegrees = -actor->Angles.Pitch.Degrees;
DVector3 apos = { x, y, z };
DVector3 diff = ViewPos - apos;
DAngle angto = diff.Angle(); DAngle angto = diff.Angle();
angto = deltaangle(actor->Angles.Yaw, angto); angto = deltaangle(actor->Angles.Yaw, angto);
float pitchDegrees = -actor->Angles.Pitch.Degrees;
bool noFlipSprite = (!dontFlip || (fabs(angto) < 90.)); bool noFlipSprite = (!dontFlip || (fabs(angto) < 90.));
mat.Rotate(0, 1, 0, (noFlipSprite) ? 0 : 180); mat.Rotate(0, 1, 0, (noFlipSprite) ? 0 : 180);
mat.Rotate(-yawvecY, 0, yawvecX, (noFlipSprite) ? -pitchDegrees : pitchDegrees); mat.Rotate(-yawvecY, 0, yawvecX, (noFlipSprite) ? -pitchDegrees : pitchDegrees);
if (drawRollSpriteActor) if (drawRollSpriteActor)
{ {
if (useOffsets) mat.Translate(xx, yy, zz); if (useOffsets) mat.Translate(xx, zz, yy);
mat.Rotate(yawvecX, 0, yawvecY, (noFlipSprite) ? -rollDegrees : rollDegrees); mat.Rotate(yawvecX, 0, yawvecY, (noFlipSprite) ? -rollDegrees : rollDegrees);
if (useOffsets) mat.Translate(-xx, -yy, -zz); if (useOffsets) mat.Translate(-xx, -zz, -yy);
} }
} }
// [fgsfds] Rotate the sprite about the sight vector (roll) // [fgsfds] Rotate the sprite about the sight vector (roll)
@ -358,20 +360,20 @@ void GLSprite::Draw(int pass)
mat.Rotate(0, 1, 0, 0); mat.Rotate(0, 1, 0, 0);
if (drawRollSpriteActor) if (drawRollSpriteActor)
{ {
if (useOffsets) mat.Translate(xx, yy, zz); if (useOffsets) mat.Translate(xx, zz, yy);
mat.Rotate(yawvecX, 0, yawvecY, rollDegrees); mat.Rotate(yawvecX, 0, yawvecY, rollDegrees);
if (useOffsets) mat.Translate(-xx, -yy, -zz); if (useOffsets) mat.Translate(-xx, -zz, -yy);
} }
} }
else if (drawRollSpriteActor) else if (drawRollSpriteActor)
{ {
if (useOffsets) mat.Translate(xx, yy, zz); if (useOffsets) mat.Translate(xx, zz, yy);
if (drawWithXYBillboard) if (drawWithXYBillboard)
{ {
mat.Rotate(-sin(angleRad), 0, cos(angleRad), -GLRenderer->mAngles.Pitch.Degrees); mat.Rotate(-sin(angleRad), 0, cos(angleRad), -GLRenderer->mAngles.Pitch.Degrees);
} }
mat.Rotate(cos(angleRad), 0, sin(angleRad), rollDegrees); mat.Rotate(cos(angleRad), 0, sin(angleRad), rollDegrees);
if (useOffsets) mat.Translate(-xx, -yy, -zz); if (useOffsets) mat.Translate(-xx, -zz, -yy);
} }
// apply the transform // apply the transform