mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-11 23:32:04 +00:00
Fixed a nullptr crash with flatsprite actors.
This commit is contained in:
parent
dd962798a5
commit
35666f1e09
1 changed files with 15 additions and 13 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue