Skip to content

Commit

Permalink
Model Renderer: Setup a vispsprite for a GL2 model
Browse files Browse the repository at this point in the history
The data is passed to ModelRenderer, which performs the drawing
according to the parameters.
  • Loading branch information
skyjake committed Aug 1, 2015
1 parent bf296be commit fa2cae3
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 14 deletions.
7 changes: 7 additions & 0 deletions doomsday/apps/client/include/render/modelrenderer.h
Expand Up @@ -102,6 +102,13 @@ class ModelRenderer
*/
void render(vissprite_t const &spr);

/**
* Render a GL2 model representing a psprite.
*
* @param pspr Parameters for the draw operation (as a vispsprite).
*/
void render(vispsprite_t const &pspr);

public:
static int identifierFromText(de::String const &text,
std::function<int (de::String const &)> resolver);
Expand Down
9 changes: 9 additions & 0 deletions doomsday/apps/client/include/render/playerweaponanimator.h
Expand Up @@ -38,8 +38,17 @@ class PlayerWeaponAnimator

void stateChanged(state_t const *state);

/**
* Determines if a 3D model has been found and is ready to be rendered.
*/
bool hasModel() const;

de::ModelDrawable const *model() const;

MobjAnimator &animator();

void setupVisPSprite(vispsprite_t &spr) const;

void advanceTime(de::TimeDelta const &elapsed);

private:
Expand Down
2 changes: 1 addition & 1 deletion doomsday/apps/client/include/render/vissprite.h
Expand Up @@ -190,7 +190,7 @@ struct vispsprite_t
de::dfloat inter; ///< Frame interpolation, 0..1
} model;
struct vispsprite_model2_s {
de::ModelDrawable const *drawable;
de::ModelDrawable const *model;
de::ModelDrawable::Animator const *animator;
float modelTransform[16];
de::gl::Cull cullFace;
Expand Down
20 changes: 18 additions & 2 deletions doomsday/apps/client/src/render/modelrenderer.cpp
Expand Up @@ -63,7 +63,7 @@ DENG2_PIMPL(ModelRenderer)
Instance(Public *i) : Base(i)
{
observer.audienceForAvailability() += this;
bank.audienceForLoad() += this;
bank.audienceForLoad() += this;
}

void init()
Expand Down Expand Up @@ -300,7 +300,7 @@ ModelRenderer::StateAnims const *ModelRenderer::animations(DotPath const &modelI
void ModelRenderer::setTransformation(Vector3f const &relativeEyePos,
Matrix4f const &modelToLocal,
Matrix4f const &localToView)
{
{
d->uMvpMatrix = localToView * modelToLocal;
d->inverseLocal = modelToLocal.inverse();
d->uEyePos = d->inverseLocal * relativeEyePos;
Expand Down Expand Up @@ -390,6 +390,22 @@ void ModelRenderer::render(vissprite_t const &spr)
GLState::current().setCull(gl::Back).apply();
}

void ModelRenderer::render(vispsprite_t const &pspr)
{
auto const &p = pspr.data.model2;

Matrix4f modelToLocal = pspr.data.model2.modelTransform;
Matrix4f localToView = GL_GetProjectionMatrix();
setTransformation(Vector3f(), modelToLocal, localToView);

GLState::push().setCull(p.cullFace);
p.model->draw(p.animator);
GLState::pop();

/// @todo Something is interfering with the cull setting elsewhere (remove this).
GLState::current().setCull(gl::Back).apply();
}

int ModelRenderer::identifierFromText(String const &text,
std::function<int (String const &)> resolver) // static
{
Expand Down
25 changes: 24 additions & 1 deletion doomsday/apps/client/src/render/playerweaponanimator.cpp
Expand Up @@ -80,14 +80,37 @@ void PlayerWeaponAnimator::stateChanged(state_t const *state)

MobjAnimator &PlayerWeaponAnimator::animator()
{
DENG2_ASSERT(bool(d->animator));
DENG2_ASSERT(hasModel());
return *d->animator;
}

void PlayerWeaponAnimator::setupVisPSprite(vispsprite_t &spr) const
{
DENG2_ASSERT(hasModel());

spr.type = VPSPR_MODEL2;
spr.data.model2.model = model();
spr.data.model2.animator = d->animator.get();
spr.data.model2.cullFace = d->cullFace;
ByteRefArray(spr.data.model2.modelTransform, sizeof(Matrix4f))
.set(0, (dbyte const *) d->transform.values(), sizeof(Matrix4f));
}

void PlayerWeaponAnimator::advanceTime(const TimeDelta &elapsed)
{
if(d->animator)
{
d->animator->advanceTime(elapsed);
}
}

bool PlayerWeaponAnimator::hasModel() const
{
return bool(d->animator);
}

ModelDrawable const *PlayerWeaponAnimator::model() const
{
if(!hasModel()) return nullptr;
return &d->animator->model();
}
17 changes: 13 additions & 4 deletions doomsday/apps/client/src/render/r_main.cpp
Expand Up @@ -28,6 +28,7 @@
#include "clientapp.h"

#include "render/billboard.h"
#include "render/modelrenderer.h"
#include "render/rend_main.h"
#include "render/rend_model.h"
#include "render/vissprite.h"
Expand Down Expand Up @@ -302,16 +303,24 @@ void Rend_Draw3DPlayerSprites()
for(vispsprite_t const &spr : visPSprites)
{
// We are only interested in models (sprites are handled elsewhere).
if(spr.type != VPSPR_MODEL) continue;
if(spr.type != VPSPR_MODEL &&
spr.type != VPSPR_MODEL2) continue;

if(altDepth.init())
{
// Clear the depth before first use.
altDepth.target().clear(GLTarget::DepthStencil);
}

vissprite_t vs; de::zap(vs);
setupModelParamsForVisPSprite(vs, spr);
Rend_DrawModel(vs);
if(spr.type == VPSPR_MODEL)
{
vissprite_t vs; de::zap(vs);
setupModelParamsForVisPSprite(vs, spr);
Rend_DrawModel(vs);
}
else
{
ClientApp::renderSystem().modelRenderer().render(spr);
}
}
}
21 changes: 15 additions & 6 deletions doomsday/apps/client/src/render/viewports.cpp
Expand Up @@ -41,6 +41,7 @@
#include "render/fx/bloom.h"
#include "render/angleclipper.h"
#include "render/cameralensfx.h"
#include "render/playerweaponanimator.h"
#include "render/rendpoly.h"
#include "render/skydrawable.h"
#include "render/vissprite.h"
Expand Down Expand Up @@ -780,14 +781,22 @@ static void setupPlayerSprites()
dfloat inter = 0;
if(useModels)
{
// Is there a model for this frame?
MobjThinker dummy;
if(viewPlayer->playerWeaponAnimator().hasModel())
{
viewPlayer->playerWeaponAnimator().setupVisPSprite(*spr);
continue;
}
else
{
// Is there a model for this frame?
MobjThinker dummy;

// Setup a dummy for the call to R_CheckModelFor.
dummy->state = spr->psp->statePtr;
dummy->tics = spr->psp->tics;
// Setup a dummy for the call to R_CheckModelFor.
dummy->state = spr->psp->statePtr;
dummy->tics = spr->psp->tics;

mf = Mobj_ModelDef(dummy, &nextmf, &inter);
mf = Mobj_ModelDef(dummy, &nextmf, &inter);
}
}

// Use a 3D model?
Expand Down

0 comments on commit fa2cae3

Please sign in to comment.