mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-23 04:22:34 +00:00
- pass mirroring info to model drawers.
Actual evaluation only implemented in OpenGL. Not tested yet because the bug report had no testable example.
This commit is contained in:
parent
decea97a34
commit
94d1a73ae8
9 changed files with 23 additions and 18 deletions
|
@ -54,7 +54,7 @@ VSMatrix FGLModelRenderer::GetViewToWorldMatrix()
|
||||||
return objectToWorldMatrix;
|
return objectToWorldMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGLModelRenderer::BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix)
|
void FGLModelRenderer::BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored)
|
||||||
{
|
{
|
||||||
glDepthFunc(GL_LEQUAL);
|
glDepthFunc(GL_LEQUAL);
|
||||||
gl_RenderState.EnableTexture(true);
|
gl_RenderState.EnableTexture(true);
|
||||||
|
@ -65,7 +65,7 @@ void FGLModelRenderer::BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, con
|
||||||
if (!(actor->RenderStyle == LegacyRenderStyles[STYLE_Normal]) && !(smf->flags & MDL_DONTCULLBACKFACES))
|
if (!(actor->RenderStyle == LegacyRenderStyles[STYLE_Normal]) && !(smf->flags & MDL_DONTCULLBACKFACES))
|
||||||
{
|
{
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
glFrontFace(GL_CW);
|
glFrontFace((mirrored ^ GLPortal::isMirrored()) ? GL_CW : GL_CCW);
|
||||||
}
|
}
|
||||||
|
|
||||||
gl_RenderState.mModelMatrix = objectToWorldMatrix;
|
gl_RenderState.mModelMatrix = objectToWorldMatrix;
|
||||||
|
@ -81,7 +81,7 @@ void FGLModelRenderer::EndDrawModel(AActor *actor, FSpriteModelFrame *smf)
|
||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGLModelRenderer::BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix)
|
void FGLModelRenderer::BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix, bool mirrored)
|
||||||
{
|
{
|
||||||
glDepthFunc(GL_LEQUAL);
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ void FGLModelRenderer::BeginDrawHUDModel(AActor *actor, const VSMatrix &objectTo
|
||||||
if (!(actor->RenderStyle == LegacyRenderStyles[STYLE_Normal]))
|
if (!(actor->RenderStyle == LegacyRenderStyles[STYLE_Normal]))
|
||||||
{
|
{
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
glFrontFace(GLPortal::isMirrored()? GL_CW : GL_CCW);
|
glFrontFace((mirrored ^ GLPortal::isMirrored()) ? GL_CW : GL_CCW);
|
||||||
}
|
}
|
||||||
|
|
||||||
gl_RenderState.mModelMatrix = objectToWorldMatrix;
|
gl_RenderState.mModelMatrix = objectToWorldMatrix;
|
||||||
|
|
|
@ -37,13 +37,13 @@ public:
|
||||||
FGLModelRenderer(int mli) : modellightindex(mli)
|
FGLModelRenderer(int mli) : modellightindex(mli)
|
||||||
{}
|
{}
|
||||||
ModelRendererType GetType() const override { return GLModelRendererType; }
|
ModelRendererType GetType() const override { return GLModelRendererType; }
|
||||||
void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix) override;
|
void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored) override;
|
||||||
void EndDrawModel(AActor *actor, FSpriteModelFrame *smf) override;
|
void EndDrawModel(AActor *actor, FSpriteModelFrame *smf) override;
|
||||||
IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) override;
|
IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) override;
|
||||||
void SetVertexBuffer(IModelVertexBuffer *buffer) override;
|
void SetVertexBuffer(IModelVertexBuffer *buffer) override;
|
||||||
void ResetVertexBuffer() override;
|
void ResetVertexBuffer() override;
|
||||||
VSMatrix GetViewToWorldMatrix() override;
|
VSMatrix GetViewToWorldMatrix() override;
|
||||||
void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix) override;
|
void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix, bool mirrored) override;
|
||||||
void EndDrawHUDModel(AActor *actor) override;
|
void EndDrawHUDModel(AActor *actor) override;
|
||||||
void SetInterpolation(double interpolation) override;
|
void SetInterpolation(double interpolation) override;
|
||||||
void SetMaterial(FTexture *skin, bool clampNoFilter, int translation) override;
|
void SetMaterial(FTexture *skin, bool clampNoFilter, int translation) override;
|
||||||
|
|
|
@ -51,7 +51,7 @@ PolyModelRenderer::PolyModelRenderer(PolyRenderThread *thread, const Mat4f &worl
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyModelRenderer::BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix)
|
void PolyModelRenderer::BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored)
|
||||||
{
|
{
|
||||||
ModelActor = actor;
|
ModelActor = actor;
|
||||||
const_cast<VSMatrix &>(objectToWorldMatrix).copy(ObjectToWorld.Matrix);
|
const_cast<VSMatrix &>(objectToWorldMatrix).copy(ObjectToWorld.Matrix);
|
||||||
|
@ -98,7 +98,7 @@ VSMatrix PolyModelRenderer::GetViewToWorldMatrix()
|
||||||
return objectToWorld;
|
return objectToWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyModelRenderer::BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix)
|
void PolyModelRenderer::BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix, bool mirrored)
|
||||||
{
|
{
|
||||||
ModelActor = actor;
|
ModelActor = actor;
|
||||||
const_cast<VSMatrix &>(objectToWorldMatrix).copy(ObjectToWorld.Matrix);
|
const_cast<VSMatrix &>(objectToWorldMatrix).copy(ObjectToWorld.Matrix);
|
||||||
|
|
|
@ -36,13 +36,13 @@ public:
|
||||||
|
|
||||||
ModelRendererType GetType() const override { return PolyModelRendererType; }
|
ModelRendererType GetType() const override { return PolyModelRendererType; }
|
||||||
|
|
||||||
void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix) override;
|
void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored) override;
|
||||||
void EndDrawModel(AActor *actor, FSpriteModelFrame *smf) override;
|
void EndDrawModel(AActor *actor, FSpriteModelFrame *smf) override;
|
||||||
IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) override;
|
IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) override;
|
||||||
void SetVertexBuffer(IModelVertexBuffer *buffer) override;
|
void SetVertexBuffer(IModelVertexBuffer *buffer) override;
|
||||||
void ResetVertexBuffer() override;
|
void ResetVertexBuffer() override;
|
||||||
VSMatrix GetViewToWorldMatrix() override;
|
VSMatrix GetViewToWorldMatrix() override;
|
||||||
void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix) override;
|
void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix, bool mirrored) override;
|
||||||
void EndDrawHUDModel(AActor *actor) override;
|
void EndDrawHUDModel(AActor *actor) override;
|
||||||
void SetInterpolation(double interpolation) override;
|
void SetInterpolation(double interpolation) override;
|
||||||
void SetMaterial(FTexture *skin, bool clampNoFilter, int translation) override;
|
void SetMaterial(FTexture *skin, bool clampNoFilter, int translation) override;
|
||||||
|
|
|
@ -171,7 +171,9 @@ void FModelRenderer::RenderModel(float x, float y, float z, FSpriteModelFrame *s
|
||||||
float stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor() : 1.f) / level.info->pixelstretch;
|
float stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor() : 1.f) / level.info->pixelstretch;
|
||||||
objectToWorldMatrix.scale(1, stretch, 1);
|
objectToWorldMatrix.scale(1, stretch, 1);
|
||||||
|
|
||||||
BeginDrawModel(actor, smf, objectToWorldMatrix);
|
float orientation = scaleFactorX * scaleFactorY * scaleFactorZ;
|
||||||
|
|
||||||
|
BeginDrawModel(actor, smf, objectToWorldMatrix, orientation < 0);
|
||||||
RenderFrameModels(smf, actor->state, actor->tics, actor->GetClass(), translation);
|
RenderFrameModels(smf, actor->state, actor->tics, actor->GetClass(), translation);
|
||||||
EndDrawModel(actor, smf);
|
EndDrawModel(actor, smf);
|
||||||
}
|
}
|
||||||
|
@ -207,7 +209,9 @@ void FModelRenderer::RenderHUDModel(DPSprite *psp, float ofsX, float ofsY)
|
||||||
objectToWorldMatrix.rotate(smf->pitchoffset, 0, 0, 1);
|
objectToWorldMatrix.rotate(smf->pitchoffset, 0, 0, 1);
|
||||||
objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0);
|
objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0);
|
||||||
|
|
||||||
BeginDrawHUDModel(playermo, objectToWorldMatrix);
|
float orientation = smf->xscale * smf->yscale * smf->zscale;
|
||||||
|
|
||||||
|
BeginDrawHUDModel(playermo, objectToWorldMatrix, orientation < 0);
|
||||||
RenderFrameModels(smf, psp->GetState(), psp->GetTics(), playermo->player->ReadyWeapon->GetClass(), 0);
|
RenderFrameModels(smf, psp->GetState(), psp->GetTics(), playermo->player->ReadyWeapon->GetClass(), 0);
|
||||||
EndDrawHUDModel(playermo);
|
EndDrawHUDModel(playermo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ public:
|
||||||
|
|
||||||
virtual ModelRendererType GetType() const = 0;
|
virtual ModelRendererType GetType() const = 0;
|
||||||
|
|
||||||
virtual void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix) = 0;
|
virtual void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored) = 0;
|
||||||
virtual void EndDrawModel(AActor *actor, FSpriteModelFrame *smf) = 0;
|
virtual void EndDrawModel(AActor *actor, FSpriteModelFrame *smf) = 0;
|
||||||
|
|
||||||
virtual IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) = 0;
|
virtual IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) = 0;
|
||||||
|
@ -74,7 +74,7 @@ public:
|
||||||
|
|
||||||
virtual VSMatrix GetViewToWorldMatrix() = 0;
|
virtual VSMatrix GetViewToWorldMatrix() = 0;
|
||||||
|
|
||||||
virtual void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix) = 0;
|
virtual void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix, bool mirrored) = 0;
|
||||||
virtual void EndDrawHUDModel(AActor *actor) = 0;
|
virtual void EndDrawHUDModel(AActor *actor) = 0;
|
||||||
|
|
||||||
virtual void SetInterpolation(double interpolation) = 0;
|
virtual void SetInterpolation(double interpolation) = 0;
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "v_text.h"
|
#include "v_text.h"
|
||||||
#include "w_wad.h"
|
#include "w_wad.h"
|
||||||
#include "w_zip.h"
|
#include "w_zip.h"
|
||||||
|
#include "i_system.h"
|
||||||
#include "ancientzip.h"
|
#include "ancientzip.h"
|
||||||
|
|
||||||
#define BUFREADCOMMENT (0x400)
|
#define BUFREADCOMMENT (0x400)
|
||||||
|
|
|
@ -82,7 +82,7 @@ namespace swrenderer
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SWModelRenderer::BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix)
|
void SWModelRenderer::BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored)
|
||||||
{
|
{
|
||||||
ModelActor = actor;
|
ModelActor = actor;
|
||||||
const_cast<VSMatrix &>(objectToWorldMatrix).copy(ObjectToWorld.Matrix);
|
const_cast<VSMatrix &>(objectToWorldMatrix).copy(ObjectToWorld.Matrix);
|
||||||
|
@ -181,7 +181,7 @@ namespace swrenderer
|
||||||
return objectToWorld;
|
return objectToWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SWModelRenderer::BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix)
|
void SWModelRenderer::BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix, bool mirrored)
|
||||||
{
|
{
|
||||||
ModelActor = actor;
|
ModelActor = actor;
|
||||||
const_cast<VSMatrix &>(objectToWorldMatrix).copy(ObjectToWorld.Matrix);
|
const_cast<VSMatrix &>(objectToWorldMatrix).copy(ObjectToWorld.Matrix);
|
||||||
|
|
|
@ -56,13 +56,13 @@ namespace swrenderer
|
||||||
|
|
||||||
ModelRendererType GetType() const override { return SWModelRendererType; }
|
ModelRendererType GetType() const override { return SWModelRendererType; }
|
||||||
|
|
||||||
void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix) override;
|
void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored) override;
|
||||||
void EndDrawModel(AActor *actor, FSpriteModelFrame *smf) override;
|
void EndDrawModel(AActor *actor, FSpriteModelFrame *smf) override;
|
||||||
IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) override;
|
IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) override;
|
||||||
void SetVertexBuffer(IModelVertexBuffer *buffer) override;
|
void SetVertexBuffer(IModelVertexBuffer *buffer) override;
|
||||||
void ResetVertexBuffer() override;
|
void ResetVertexBuffer() override;
|
||||||
VSMatrix GetViewToWorldMatrix() override;
|
VSMatrix GetViewToWorldMatrix() override;
|
||||||
void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix) override;
|
void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix, bool mirrored) override;
|
||||||
void EndDrawHUDModel(AActor *actor) override;
|
void EndDrawHUDModel(AActor *actor) override;
|
||||||
void SetInterpolation(double interpolation) override;
|
void SetInterpolation(double interpolation) override;
|
||||||
void SetMaterial(FTexture *skin, bool clampNoFilter, int translation) override;
|
void SetMaterial(FTexture *skin, bool clampNoFilter, int translation) override;
|
||||||
|
|
Loading…
Reference in a new issue