Skip to content

Commit

Permalink
Refactor|Map Renderer: Continued splitting up r_things.cpp; cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
danij-deng committed Aug 31, 2013
1 parent aab58ee commit 046bcf6
Show file tree
Hide file tree
Showing 6 changed files with 215 additions and 204 deletions.
1 change: 1 addition & 0 deletions doomsday/client/include/gl/gl_texmanager.h
Expand Up @@ -251,6 +251,7 @@ texturevariantspecification_t &GL_DetailTextureSpec(
* revised texture management APIs.
*/

DGLuint GL_PrepareFlaremap(de::Uri const &resourceUri);
DGLuint GL_PrepareSysFlaremap(flaretexid_t which);
DGLuint GL_PrepareLSTexture(lightingtexid_t which);

Expand Down
8 changes: 8 additions & 0 deletions doomsday/client/include/render/r_main.h
Expand Up @@ -67,6 +67,14 @@ DENG_EXTERN_C int validCount;
DENG_EXTERN_C int frameCount;
DENG_EXTERN_C int rendInfoTris;

DENG_EXTERN_C int levelFullBright;

DENG_EXTERN_C float pspOffset[2], pspLightLevelMultiplier;
DENG_EXTERN_C int psp3d;
DENG_EXTERN_C float weaponOffsetScale, weaponFOVShift;
DENG_EXTERN_C int weaponOffsetScaleY;
DENG_EXTERN_C byte weaponScaleMode; // cvar

DENG_EXTERN_C boolean firstFrameAfterLoad;

DENG_EXTERN_C byte precacheMapMaterials, precacheSprites, precacheSkins;
Expand Down
13 changes: 1 addition & 12 deletions doomsday/client/include/render/r_things.h
@@ -1,4 +1,4 @@
/** @file r_things.h Map Object Management and Refresh.
/** @file r_things.h Map Object => Vissprite Projection.
*
* @authors Copyright © 2003-2013 Jaakko Keränen <jaakko.keranen@iki.fi>
* @authors Copyright © 2006-2013 Daniel Swanson <danij@dengine.net>
Expand All @@ -23,16 +23,10 @@

#include <de/libdeng1.h>

DENG_EXTERN_C int levelFullBright;
DENG_EXTERN_C float pspOffset[2], pspLightLevelMultiplier;
DENG_EXTERN_C int alwaysAlign;
DENG_EXTERN_C float weaponOffsetScale, weaponFOVShift;
DENG_EXTERN_C int weaponOffsetScaleY;
DENG_EXTERN_C byte weaponScaleMode; // cvar
DENG_EXTERN_C float modelSpinSpeed;
DENG_EXTERN_C int maxModelDistance, noSpriteZWrite;
DENG_EXTERN_C int useSRVO, useSRVOAngle;
DENG_EXTERN_C int psp3d;

#ifdef __cplusplus
extern "C" {
Expand All @@ -43,11 +37,6 @@ extern "C" {
*/
void R_ProjectSprite(struct mobj_s *mobj);

/**
* If 3D models are found for psprites, here we will create vissprites for them.
*/
void R_ProjectPlayerSprites(void);

#ifdef __cplusplus
} // extern "C"
#endif
Expand Down
23 changes: 23 additions & 0 deletions doomsday/client/src/gl/gl_texmanager.cpp
Expand Up @@ -1873,6 +1873,29 @@ DGLuint GL_PrepareSysFlaremap(flaretexid_t which)
return sysFlareTextures[which];
}

DGLuint GL_PrepareFlaremap(de::Uri const &resourceUri)
{
if(resourceUri.path().length() == 1)
{
// Select a system flare by numeric identifier?
int number = resourceUri.path().toStringRef().first().digitValue();
if(number == 0) return 0; // automatic
if(number >= 1 && number <= 4)
{
return GL_PrepareSysFlaremap(flaretexid_t(number - 1));
}
}
if(Texture *tex = R_FindTextureByResourceUri("Flaremaps", &resourceUri))
{
if(TextureVariant const *variant = tex->prepareVariant(Rend_HaloTextureSpec()))
{
return variant->glName();
}
// Dang...
}
return 0;
}

TexSource GL_LoadExtImage(image_t &image, char const *_searchPath, gfxmode_t mode)
{
DENG_ASSERT(_searchPath);
Expand Down
129 changes: 128 additions & 1 deletion doomsday/client/src/render/r_main.cpp
Expand Up @@ -37,9 +37,12 @@
# include "edit_bias.h"
#endif
#include "gl/svg.h"

#include "world/p_players.h"
#include "world/p_objlink.h"
#include "world/thinkers.h"
#include "BspLeaf"

#include "render/vignette.h"
#include "render/vissprite.h"

Expand Down Expand Up @@ -92,6 +95,19 @@ static int rendCameraSmooth = true; // Smoothed by default.
static viewport_t *currentViewport;
#endif

int psp3d;
float pspLightLevelMultiplier = 1;
float pspOffset[2];
int levelFullBright;
int weaponOffsetScaleY = 1000;

/*
* Console variables:
*/
float weaponFOVShift = 45;
float weaponOffsetScale = 0.3183f; // 1/Pi
byte weaponScaleMode = SCALEMODE_SMART_STRETCH;

void R_Register()
{
#ifdef __CLIENT__
Expand Down Expand Up @@ -925,6 +941,117 @@ void R_RenderBlankView()
UI_DrawDDBackground(Point2Raw(0, 0), Size2Raw(320, 200), 1);
}

void R_SetupPlayerSprites()
{
psp3d = false;

// Cameramen have no psprites.
ddplayer_t *ddpl = &viewPlayer->shared;
if((ddpl->flags & DDPF_CAMERA) || (ddpl->flags & DDPF_CHASECAM))
return;

// Determine if we should be drawing all the psprites full bright?
boolean isFullBright = (levelFullBright != 0);
if(!isFullBright)
{
ddpsprite_t *psp = ddpl->pSprites;
for(int i = 0; i < DDMAXPSPRITES; ++i, psp++)
{
if(!psp->statePtr) continue;

// If one of the psprites is fullbright, both are.
if(psp->statePtr->flags & STF_FULLBRIGHT)
isFullBright = true;
}
}

viewdata_t const *viewData = R_ViewData(viewPlayer - ddPlayers);

ddpsprite_t *psp = ddpl->pSprites;
for(int i = 0; i < DDMAXPSPRITES; ++i, psp++)
{
vispsprite_t *spr = &visPSprites[i];

spr->type = VPSPR_SPRITE;
spr->psp = psp;

if(!psp->statePtr) continue;

// First, determine whether this is a model or a sprite.
bool isModel = false;
modeldef_t *mf = 0, *nextmf = 0;
float inter = 0;
if(useModels)
{
// Is there a model for this frame?
mobj_t dummy;

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

inter = Models_ModelForMobj(&dummy, &mf, &nextmf);
if(mf) isModel = true;
}

if(isModel)
{
// Yes, draw a 3D model (in Rend_Draw3DPlayerSprites).
// There are 3D psprites.
psp3d = true;

spr->type = VPSPR_MODEL;

spr->data.model.bspLeaf = ddpl->mo->bspLeaf;
spr->data.model.flags = 0;
// 32 is the raised weapon height.
spr->data.model.gzt = viewData->current.origin[VZ];
spr->data.model.secFloor = ddpl->mo->bspLeaf->visFloorHeight();
spr->data.model.secCeil = ddpl->mo->bspLeaf->visCeilingHeight();
spr->data.model.pClass = 0;
spr->data.model.floorClip = 0;

spr->data.model.mf = mf;
spr->data.model.nextMF = nextmf;
spr->data.model.inter = inter;
spr->data.model.viewAligned = true;
spr->origin[VX] = viewData->current.origin[VX];
spr->origin[VY] = viewData->current.origin[VY];
spr->origin[VZ] = viewData->current.origin[VZ];

// Offsets to rotation angles.
spr->data.model.yawAngleOffset = psp->pos[VX] * weaponOffsetScale - 90;
spr->data.model.pitchAngleOffset =
(32 - psp->pos[VY]) * weaponOffsetScale * weaponOffsetScaleY / 1000.0f;
// Is the FOV shift in effect?
if(weaponFOVShift > 0 && fieldOfView > 90)
spr->data.model.pitchAngleOffset -= weaponFOVShift * (fieldOfView - 90) / 90;
// Real rotation angles.
spr->data.model.yaw =
viewData->current.angle / (float) ANGLE_MAX *-360 + spr->data.model.yawAngleOffset + 90;
spr->data.model.pitch = viewData->current.pitch * 85 / 110 + spr->data.model.yawAngleOffset;
memset(spr->data.model.visOff, 0, sizeof(spr->data.model.visOff));

spr->data.model.alpha = psp->alpha;
spr->data.model.stateFullBright = (psp->flags & DDPSPF_FULLBRIGHT)!=0;
}
else
{
// No, draw a 2D sprite (in Rend_DrawPlayerSprites).
spr->type = VPSPR_SPRITE;

// Adjust the center slightly so an angle can be calculated.
spr->origin[VX] = viewData->current.origin[VX];
spr->origin[VY] = viewData->current.origin[VY];
spr->origin[VZ] = viewData->current.origin[VZ];

spr->data.sprite.bspLeaf = ddpl->mo->bspLeaf;
spr->data.sprite.alpha = psp->alpha;
spr->data.sprite.isFullBright = (psp->flags & DDPSPF_FULLBRIGHT)!=0;
}
}
}

#undef R_RenderPlayerView
DENG_EXTERN_C void R_RenderPlayerView(int num)
{
Expand All @@ -949,7 +1076,7 @@ DENG_EXTERN_C void R_RenderPlayerView(int num)
// Setup for rendering the frame.
R_SetupFrame(player);

R_ProjectPlayerSprites(); // Only if 3D models exists for them.
R_SetupPlayerSprites();

// Hide the viewPlayer's mobj?
int oldFlags = 0;
Expand Down

0 comments on commit 046bcf6

Please sign in to comment.