From c7fc3154b6c9b6ffab318d315991ec356be5cc69 Mon Sep 17 00:00:00 2001 From: danij Date: Sat, 2 May 2015 10:02:12 +0100 Subject: [PATCH] Renderer|Client: Cleanup --- doomsday/client/include/de_render.h | 1 - doomsday/client/include/render/billboard.h | 74 ++-- doomsday/client/include/render/rend_model.h | 78 ++-- doomsday/client/include/render/vissprite.h | 159 ++++---- doomsday/client/src/render/lumobj.cpp | 101 ++--- doomsday/client/src/render/r_main.cpp | 23 +- doomsday/client/src/render/viewports.cpp | 430 ++++++++++---------- doomsday/client/src/render/vissprite.cpp | 55 ++- 8 files changed, 455 insertions(+), 466 deletions(-) diff --git a/doomsday/client/include/de_render.h b/doomsday/client/include/de_render.h index f4f09347e8..6800118fa8 100644 --- a/doomsday/client/include/de_render.h +++ b/doomsday/client/include/de_render.h @@ -37,7 +37,6 @@ #include "render/rendpoly.h" #include "render/billboard.h" #include "render/cameralensfx.h" -#include "render/vissprite.h" #endif #include "r_util.h" diff --git a/doomsday/client/include/render/billboard.h b/doomsday/client/include/render/billboard.h index c8fe17c70c..2ce8172ffb 100644 --- a/doomsday/client/include/render/billboard.h +++ b/doomsday/client/include/render/billboard.h @@ -1,6 +1,4 @@ /** @file billboard.h Rendering billboard "sprites". - * - * @ingroup render * * @authors Copyright © 2003-2013 Jaakko Keränen * @authors Copyright © 2007-2015 Daniel Swanson @@ -20,8 +18,8 @@ * 02110-1301 USA */ -#ifndef DENG_CLIENT_RENDER_BILLBOARD_H -#define DENG_CLIENT_RENDER_BILLBOARD_H +#ifndef CLIENT_RENDER_BILLBOARD_H +#define CLIENT_RENDER_BILLBOARD_H #include "dd_types.h" #include "Material" @@ -29,53 +27,59 @@ #include "MaterialVariantSpec" class BspLeaf; +struct vissprite_t; /** * Billboard drawing arguments for a masked wall. * * A sort of a sprite, I guess... Masked walls must be rendered sorted with * sprites, so no artifacts appear when sprites are seen behind masked walls. + * + * @ingroup render */ struct drawmaskedwallparams_t { MaterialAnimator *animator; - blendmode_t blendMode; ///< Blendmode to be used when drawing (two sided mid textures only) + blendmode_t blendMode; ///< Blendmode to be used when drawing (two sided mid textures only) struct wall_vertex_s { - float pos[3]; ///< x y and z coordinates. - float color[4]; + de::dfloat pos[3]; ///< x y and z coordinates. + de::dfloat color[4]; } vertices[4]; - double texOffset[2]; - float texCoord[2][2]; ///< u and v coordinates. + de::ddouble texOffset[2]; + de::dfloat texCoord[2][2]; ///< u and v coordinates. - DGLuint modTex; ///< Texture to modulate with. - float modTexCoord[2][2]; ///< [top-left, bottom-right][x, y] - float modColor[4]; + DGLuint modTex; ///< Texture to modulate with. + de::dfloat modTexCoord[2][2]; ///< [top-left, bottom-right][x, y] + de::dfloat modColor[4]; }; void Rend_DrawMaskedWall(drawmaskedwallparams_t const &parms); /** * Billboard drawing arguments for a "player" sprite (HUD sprite). + * @ingroup render */ struct rendpspriteparams_t { - float pos[2]; ///< [X, Y] Screen-space position. - float width, height; + de::dfloat pos[2]; ///< [X, Y] Screen-space position. + de::dfloat width; + de::dfloat height; Material *mat; - float texOffset[2]; - dd_bool texFlip[2]; ///< [X, Y] Flip along the specified axis. + de::dfloat texOffset[2]; + dd_bool texFlip[2]; ///< [X, Y] Flip along the specified axis. - float ambientColor[4]; - uint vLightListIdx; + de::dfloat ambientColor[4]; + de::duint vLightListIdx; }; void Rend_DrawPSprite(rendpspriteparams_t const &parms); /** * Billboard drawing arguments for a map entity, sprite visualization. + * @ingroup render */ struct drawspriteparams_t { @@ -86,12 +90,13 @@ struct drawspriteparams_t BspLeaf *bspLeaf; }; -void Rend_DrawSprite(struct vissprite_s const &spr); +void Rend_DrawSprite(vissprite_t const &spr); -de::MaterialVariantSpec const &Rend_SpriteMaterialSpec(int tclass = 0, int tmap = 0); +de::MaterialVariantSpec const &Rend_SpriteMaterialSpec(de::dint tclass = 0, de::dint tmap = 0); /** * @defgroup rendFlareFlags Flare renderer flags + * @ingroup render * @{ */ #define RFF_NO_PRIMARY 0x1 ///< Do not draw a primary flare (aka halo). @@ -102,26 +107,29 @@ de::MaterialVariantSpec const &Rend_SpriteMaterialSpec(int tclass = 0, int tmap * Billboard drawing arguments for a lens flare. * * @see H_RenderHalo() + * @ingroup render */ struct drawflareparams_t { - byte flags; ///< @ref rendFlareFlags. - int size; - float color[3]; - byte factor; - float xOff; + de::dbyte flags; ///< @ref rendFlareFlags. + de::dint size; + de::dfloat color[3]; + de::dbyte factor; + de::dfloat xOff; DGLuint tex; ///< Flaremap if flareCustom ELSE (flaretexName id. Zero = automatical) - float mul; ///< Flare brightness factor. + de::dfloat mul; ///< Flare brightness factor. dd_bool isDecoration; - int lumIdx; + de::dint lumIdx; }; -DENG_EXTERN_C int alwaysAlign; -DENG_EXTERN_C int spriteLight, useSpriteAlpha, useSpriteBlend; -DENG_EXTERN_C int noSpriteZWrite; -DENG_EXTERN_C byte noSpriteTrans; -DENG_EXTERN_C byte devNoSprites; +DENG_EXTERN_C de::dint alwaysAlign; +DENG_EXTERN_C de::dint spriteLight; +DENG_EXTERN_C de::dint useSpriteAlpha; +DENG_EXTERN_C de::dint useSpriteBlend; +DENG_EXTERN_C de::dint noSpriteZWrite; +DENG_EXTERN_C de::dbyte noSpriteTrans; +DENG_EXTERN_C de::dbyte devNoSprites; DENG_EXTERN_C void Rend_SpriteRegister(); -#endif // DENG_CLIENT_RENDER_BILLBOARD_H +#endif // CLIENT_RENDER_BILLBOARD_H diff --git a/doomsday/client/include/render/rend_model.h b/doomsday/client/include/render/rend_model.h index 8f6e4c869d..d97a4e0f95 100644 --- a/doomsday/client/include/render/rend_model.h +++ b/doomsday/client/include/render/rend_model.h @@ -1,9 +1,7 @@ /** @file rend_model.h Model renderer (v2.1). - * - * @ingroup render * * @authors Copyright © 2003-2013 Jaakko Keränen - * @authors Copyright © 2007-2013 Daniel Swanson + * @authors Copyright © 2007-2015 Daniel Swanson * * @par License * GPL: http://www.gnu.org/licenses/gpl.html @@ -20,8 +18,8 @@ * 02110-1301 USA */ -#ifndef DENG_CLIENT_RENDER_MODEL_H -#define DENG_CLIENT_RENDER_MODEL_H +#ifndef CLIENT_RENDER_MODEL_H +#define CLIENT_RENDER_MODEL_H #include "ModelDef" #include "rend_main.h" @@ -29,37 +27,37 @@ #include class TextureVariantSpec; +struct vissprite_t; /// Absolute maximum number of vertices per submodel supported by this module. #define RENDER_MAX_MODEL_VERTS 16192 -/// @todo Split this large inflexible structure into logical subcomponent pieces. +/** + * @todo Split this large inflexible structure into logical subcomponent pieces. + * @ingroup render + */ struct drawmodelparams_t { - // Animation, frame interpolation: - ModelDef *mf, *nextMF; - float inter; - dd_bool alwaysInterpolate; - int id; // For a unique skin offset. - int selector; - - // Position/Orientation/Scale: - //VisModelPose pose; - - // Appearance: - int flags; // Mobj flags. - int tmap; - - // Lighting/color: - //VisModelLighting light; +// Animation, frame interpolation: + ModelDef *mf; + ModelDef *nextMF; + de::dfloat inter; + dd_bool alwaysInterpolate; + de::dint id; ///< For a unique skin offset. + de::dint selector; + +// Appearance: + de::dint flags; ///< Mobj flags. + de::dint tmap; // Shiney texture mapping: - float shineYawOffset; - float shinePitchOffset; - dd_bool shineTranslateWithViewerPos; - dd_bool shinepspriteCoordSpace; // Use the psprite coordinate space hack. + de::dfloat shineYawOffset; + de::dfloat shinePitchOffset; + dd_bool shineTranslateWithViewerPos; + dd_bool shinepspriteCoordSpace; ///< Use the psprite coordinate space hack. }; +/// @ingroup render struct drawmodel2params_t { struct mobj_s const *object; @@ -67,16 +65,16 @@ struct drawmodel2params_t de::ModelDrawable::Animator const *animator; }; -DENG_EXTERN_C byte useModels; -DENG_EXTERN_C int modelLight; -DENG_EXTERN_C int frameInter; -DENG_EXTERN_C float modelAspectMod; -DENG_EXTERN_C int mirrorHudModels; -DENG_EXTERN_C int modelShinyMultitex; -DENG_EXTERN_C float modelSpinSpeed; -DENG_EXTERN_C int maxModelDistance; -DENG_EXTERN_C float rendModelLOD; -DENG_EXTERN_C byte precacheSkins; +DENG_EXTERN_C de::dbyte useModels; +DENG_EXTERN_C de::dint modelLight; +DENG_EXTERN_C de::dint frameInter; +DENG_EXTERN_C de::dfloat modelAspectMod; +DENG_EXTERN_C de::dint mirrorHudModels; +DENG_EXTERN_C de::dint modelShinyMultitex; +DENG_EXTERN_C de::dfloat modelSpinSpeed; +DENG_EXTERN_C de::dint maxModelDistance; +DENG_EXTERN_C de::dfloat rendModelLOD; +DENG_EXTERN_C de::dbyte precacheSkins; /** * Registers the console commands and variables used by this module. @@ -110,7 +108,7 @@ void Rend_ModelShutdown(); * @return @c true= successfully expanded. May fail if @a numVertices is larger * than RENDER_MAX_MODEL_VERTS. */ -bool Rend_ModelExpandVertexBuffers(uint numVertices); +bool Rend_ModelExpandVertexBuffers(de::duint numVertices); /** * Lookup the texture specification for diffuse model skins. @@ -130,13 +128,13 @@ TextureVariantSpec const &Rend_ModelShinyTextureSpec(); /** * Render all the submodels of a model. */ -void Rend_DrawModel(struct vissprite_s const &spr); +void Rend_DrawModel(vissprite_t const &spr); /** * Render a GL2 model. * * @param parms Parameters for the draw operation. */ -void Rend_DrawModel2(struct vissprite_s const &spr); +void Rend_DrawModel2(vissprite_t const &spr); -#endif // DENG_CLIENT_RENDER_MODEL_H +#endif // CLIENT_RENDER_MODEL_H diff --git a/doomsday/client/include/render/vissprite.h b/doomsday/client/include/render/vissprite.h index a4e462a4d7..edf3d7f26a 100644 --- a/doomsday/client/include/render/vissprite.h +++ b/doomsday/client/include/render/vissprite.h @@ -1,7 +1,7 @@ /** @file vissprite.h Projected visible sprite ("vissprite") management. * * @authors Copyright © 2003-2013 Jaakko Keränen - * @authors Copyright © 2006-2013 Daniel Swanson + * @authors Copyright © 2006-2015 Daniel Swanson * * @par License * GPL: http://www.gnu.org/licenses/gpl.html @@ -18,9 +18,8 @@ * 02110-1301 USA */ -#ifdef __CLIENT__ -#ifndef DENG_CLIENT_RENDER_VISSPRITE_H -#define DENG_CLIENT_RENDER_VISSPRITE_H +#ifndef CLIENT_RENDER_VISSPRITE_H +#define CLIENT_RENDER_VISSPRITE_H #include @@ -29,43 +28,47 @@ #define MAXVISSPRITES 8192 -// These constants are used as the type of vissprite_s. -typedef enum { +/** + * These constants are used as the type of vissprite. + * @ingroup render + */ +enum visspritetype_t +{ VSPR_SPRITE, VSPR_MASKED_WALL, VSPR_MODEL, - VSPR_MODEL_GL2, ///< GL2 model (de::ModelDrawable) + VSPR_MODEL_GL2, ///< GL2 model (de::ModelDrawable) VSPR_FLARE -} visspritetype_t; +}; #define MAX_VISSPRITE_LIGHTS (10) +/// @ingroup render struct VisEntityPose { - de::Vector3d origin; - float topZ; ///< Global top Z coordinate (origin Z is the bottom). - de::Vector3d srvo; ///< Short-range visual offset. - coord_t distance; ///< Distance from viewer. - float yaw; - float extraYawAngle; - float yawAngleOffset; ///< @todo We do not need three sets of angles... - float pitch; - float extraPitchAngle; - float pitchAngleOffset; - float extraScale; - bool viewAligned; - bool mirrored; ///< If true the model will be mirrored about its Z axis (in model space). + de::Vector3d origin; + de::dfloat topZ; ///< Global top Z coordinate (origin Z is the bottom). + de::Vector3d srvo; ///< Short-range visual offset. + coord_t distance; ///< Distance from viewer. + de::dfloat yaw; + de::dfloat extraYawAngle; + de::dfloat yawAngleOffset; ///< @todo We do not need three sets of angles... + de::dfloat pitch; + de::dfloat extraPitchAngle; + de::dfloat pitchAngleOffset; + de::dfloat extraScale; + bool viewAligned; + bool mirrored; ///< If true the model will be mirrored about its Z axis (in model space). VisEntityPose() { de::zap(*this); } - VisEntityPose(de::Vector3d const &origin_, - de::Vector3d const &visOffset, + VisEntityPose(de::Vector3d const &origin_, de::Vector3d const &visOffset, bool viewAlign_ = false, - float topZ_ = 0, - float yaw_ = 0, - float yawAngleOffset_ = 0, - float pitch_ = 0, - float pitchAngleOffset_= 0) + de::dfloat topZ_ = 0, + de::dfloat yaw_ = 0, + de::dfloat yawAngleOffset_ = 0, + de::dfloat pitch_ = 0, + de::dfloat pitchAngleOffset_= 0) : origin(origin_) , topZ(topZ_) , srvo(visOffset) @@ -86,29 +89,29 @@ struct VisEntityPose de::Vector3d mid() const { return de::Vector3d(origin.x, origin.y, midZ()); } }; +/// @ingroup render struct VisEntityLighting { de::Vector4f ambientColor; - uint vLightListIdx; + de::duint vLightListIdx; VisEntityLighting() { de::zap(*this); } - VisEntityLighting(de::Vector4f const &ambientColor_, - uint lightListIndex) - : vLightListIdx(lightListIndex) - { - ambientColor = ambientColor_; - } + VisEntityLighting(de::Vector4f const &ambientColor, de::duint lightListIndex) + : ambientColor(ambientColor) + , vLightListIdx(lightListIndex) + {} }; /** * vissprite_t is a mobj or masked wall that will be drawn refresh. + * @ingroup render */ -typedef struct vissprite_s { - struct vissprite_s *prev, *next; - visspritetype_t type; // VSPR_* type of vissprite. - //coord_t distance; // Vissprites are sorted by distance. - //de::Vector3d origin; +struct vissprite_t +{ + vissprite_t *prev; + vissprite_t *next; + visspritetype_t type; VisEntityPose pose; VisEntityLighting light; @@ -121,7 +124,7 @@ typedef struct vissprite_s { drawmodel2params_t model2; drawflareparams_t flare; } data; -} vissprite_t; +}; #define VS_SPRITE(v) (&((v)->data.sprite)) #define VS_WALL(v) (&((v)->data.wall)) @@ -129,60 +132,63 @@ typedef struct vissprite_s { #define VS_MODEL2(v) (&((v)->data.model2)) #define VS_FLARE(v) (&((v)->data.flare)) -void VisSprite_SetupSprite(vissprite_t *spr, - VisEntityPose const &pose, - VisEntityLighting const &light, - float /*secFloor*/, float /*secCeil*/, float /*floorClip*/, float /*top*/, +void VisSprite_SetupSprite(vissprite_t *spr, VisEntityPose const &pose, VisEntityLighting const &light, + de::dfloat secFloor, de::dfloat secCeil, de::dfloat floorClip, de::dfloat top, Material &material, bool matFlipS, bool matFlipT, blendmode_t blendMode, - int tClass, int tMap, BspLeaf *bspLeafAtOrigin, - bool /*floorAdjust*/, bool /*fitTop*/, bool /*fitBottom*/); + de::dint tClass, de::dint tMap, BspLeaf *bspLeafAtOrigin, + bool floorAdjust, bool fitTop, bool fitBottom); -void VisSprite_SetupModel(vissprite_t *spr, - VisEntityPose const &pose, - VisEntityLighting const &light, - ModelDef *mf, ModelDef *nextMF, float inter, - int id, int selector, BspLeaf * /*bspLeafAtOrigin*/, int mobjDDFlags, int tmap, - bool /*fullBright*/, bool alwaysInterpolate); +void VisSprite_SetupModel(vissprite_t *spr, VisEntityPose const &pose, VisEntityLighting const &light, + ModelDef *mf, ModelDef *nextMF, de::dfloat inter, + de::dint id, de::dint selector, BspLeaf *bspLeafAtOrigin, de::dint mobjDDFlags, de::dint tmap, + bool fullBright, bool alwaysInterpolate); -typedef enum { +/// @ingroup render +enum vispspritetype_t +{ VPSPR_SPRITE, VPSPR_MODEL -} vispspritetype_t; +}; -typedef struct vispsprite_s { +/// @ingroup render +struct vispsprite_t +{ vispspritetype_t type; ddpsprite_t *psp; - coord_t origin[3]; + de::Vector3d origin; union vispsprite_data_u { struct vispsprite_sprite_s { BspLeaf *bspLeaf; - float alpha; + de::dfloat alpha; dd_bool isFullBright; } sprite; struct vispsprite_model_s { BspLeaf *bspLeaf; - coord_t topZ; // global top for silhouette clipping - int flags; // for color translation and shadow draw - uint id; - int selector; - int pClass; // player class (used in translation) + coord_t topZ; ///< global top for silhouette clipping + de::dint flags; ///< for color translation and shadow draw + de::duint id; + de::dint selector; + de::dint pClass; ///< player class (used in translation) coord_t floorClip; dd_bool stateFullBright; - dd_bool viewAligned; // Align to view plane. - coord_t secFloor, secCeil; - float alpha; - coord_t visOff[3]; // Last-minute offset to coords. - dd_bool floorAdjust; // Allow moving sprite to match visible floor. - - ModelDef *mf, *nextMF; - float yaw, pitch; - float pitchAngleOffset; - float yawAngleOffset; - float inter; // Frame interpolation, 0..1 + dd_bool viewAligned; ///< @c true= Align to view plane. + coord_t secFloor; + coord_t secCeil; + de::dfloat alpha; + de::ddouble visOff[3]; ///< Last-minute offset to coords. + dd_bool floorAdjust; ///< Allow moving sprite to match visible floor. + + ModelDef *mf; + ModelDef *nextMF; + de::dfloat yaw; + de::dfloat pitch; + de::dfloat pitchAngleOffset; + de::dfloat yawAngleOffset; + de::dfloat inter; ///< Frame interpolation, 0..1 } model; } data; -} vispsprite_t; +}; DENG_EXTERN_C vissprite_t visSprites[MAXVISSPRITES], *visSpriteP; DENG_EXTERN_C vissprite_t visSprSortedHead; @@ -195,5 +201,4 @@ vissprite_t *R_NewVisSprite(visspritetype_t type); void R_SortVisSprites(); -#endif // DENG_CLIENT_RENDER_VISSPRITE_H -#endif // __CLIENT__ +#endif // CLIENT_RENDER_VISSPRITE_H diff --git a/doomsday/client/src/render/lumobj.cpp b/doomsday/client/src/render/lumobj.cpp index a4585b60cc..edf090189e 100644 --- a/doomsday/client/src/render/lumobj.cpp +++ b/doomsday/client/src/render/lumobj.cpp @@ -1,7 +1,7 @@ -/** @file lumobj.cpp Luminous object. +/** @file lumobj.cpp Luminous object. * * @authors Copyright © 2003-2013 Jaakko Keränen - * @authors Copyright © 2006-2013 Daniel Swanson + * @authors Copyright © 2006-2015 Daniel Swanson * * @par License * GPL: http://www.gnu.org/licenses/gpl.html @@ -18,54 +18,43 @@ * 02110-1301 USA */ +#include "de_platform.h" +#include "render/lumobj.h" + #include +#include -#include "de_platform.h" -#include "de_console.h" -#include "de_render.h" +#include "render/rend_halo.h" +#include "render/vissprite.h" #include "world/map.h" -#include "render/lumobj.h" - using namespace de; -static int radiusMax = 256; ///< Absolute maximum lumobj radius (cvar). -static float radiusScale = 4.24f; ///< Radius scale factor (cvar). +static dint radiusMax = 256; ///< Absolute maximum lumobj radius (cvar). +static dfloat radiusScale = 4.24f; ///< Radius scale factor (cvar). -float Lumobj::Source::occlusion(Vector3d const &eye) const +dfloat Lumobj::Source::occlusion(Vector3d const & /*eye*/) const { - DENG2_UNUSED(eye); - return 1; // Fully visible. + return 1; // Fully visible. } DENG2_PIMPL_NOREF(Lumobj) { - Source const *source;///< Source of the lumobj (if any, not owned). - double maxDistance; ///< Used when rendering to limit the number drawn lumobjs. - Vector3f color; ///< Light color/intensity. - double radius; ///< Radius in map space units. - double zOffset; ///< Z-axis origin offset in map space units. - float flareSize; ///< Scale factor. - DGLuint flareTex; ///< Custom flare texture (@todo should be Texture ptr). + Source const *source = nullptr; ///< Source of the lumobj (if any, not owned). + ddouble maxDistance = 0; ///< Used when rendering to limit the number drawn lumobjs. + Vector3f color = Vector3f(1, 1, 1); ///< Light color/intensity. + ddouble radius = 256; ///< Radius in map space units. + ddouble zOffset = 0; ///< Z-axis origin offset in map space units. + dfloat flareSize = 0; ///< Scale factor. + DGLuint flareTex = 0; ///< Custom flare texture (@todo should be Texture ptr). /// Custom lightmaps (if any, not owned): - Texture *sideTex; - Texture *downTex; - Texture *upTex; - - Instance() - : source (0) - , maxDistance(0) - , color (Vector3f(1, 1, 1)) - , radius (256) - , zOffset (0) - , flareSize (0) - , flareTex (0) - , sideTex (0) - , downTex (0) - , upTex (0) - {} + Texture *sideTex = nullptr; + Texture *downTex = nullptr; + Texture *upTex = nullptr; + + Instance() {} Instance(Instance const &other) : de::IPrivate() @@ -82,7 +71,7 @@ DENG2_PIMPL_NOREF(Lumobj) {} }; -Lumobj::Lumobj(Vector3d const &origin, double radius, Vector3f const &color) +Lumobj::Lumobj(Vector3d const &origin, ddouble radius, Vector3f const &color) : MapObject(origin), d(new Instance()) { setRadius(radius); @@ -98,7 +87,7 @@ void Lumobj::setSource(Source const *newSource) d->source = newSource; } -de::Vector3f const &Lumobj::color() const +Vector3f const &Lumobj::color() const { return d->color; } @@ -112,18 +101,18 @@ Lumobj &Lumobj::setColor(Vector3f const &newColor) return *this; } -double Lumobj::radius() const +ddouble Lumobj::radius() const { return d->radius; } -Lumobj &Lumobj::setRadius(double newRadius) +Lumobj &Lumobj::setRadius(ddouble newRadius) { // Apply the global scale factor. newRadius *= 40 * ::radiusScale; // Normalize. - newRadius = de::clamp(.0001, de::abs(newRadius), ::radiusMax); + newRadius = de::clamp(.0001, de::abs(newRadius), ::radiusMax); if(d->radius != newRadius) { @@ -138,23 +127,23 @@ AABoxd Lumobj::aaBox() const origin().x + d->radius, origin().y + d->radius); } -double Lumobj::zOffset() const +ddouble Lumobj::zOffset() const { return d->zOffset; } -Lumobj &Lumobj::setZOffset(double newZOffset) +Lumobj &Lumobj::setZOffset(ddouble newZOffset) { d->zOffset = newZOffset; return *this; } -double Lumobj::maxDistance() const +ddouble Lumobj::maxDistance() const { return d->maxDistance; } -Lumobj &Lumobj::setMaxDistance(double newMaxDistance) +Lumobj &Lumobj::setMaxDistance(ddouble newMaxDistance) { d->maxDistance = newMaxDistance; return *this; @@ -168,7 +157,7 @@ Texture *Lumobj::lightmap(LightmapSemantic semantic) const case Down: return d->downTex; case Up: return d->upTex; }; - DENG_ASSERT(false); + DENG2_ASSERT(false); return d->sideTex; } @@ -183,12 +172,12 @@ Lumobj &Lumobj::setLightmap(LightmapSemantic semantic, Texture *newTexture) return *this; } -float Lumobj::flareSize() const +dfloat Lumobj::flareSize() const { return d->flareSize; } -Lumobj &Lumobj::setFlareSize(float newFlareSize) +Lumobj &Lumobj::setFlareSize(dfloat newFlareSize) { d->flareSize = de::max(0.f, newFlareSize); return *this; @@ -205,7 +194,7 @@ Lumobj &Lumobj::setFlareTexture(DGLuint newTexture) return *this; } -float Lumobj::attenuation(double distFromEye) const +dfloat Lumobj::attenuation(ddouble distFromEye) const { if(distFromEye > 0 && d->maxDistance > 0) { @@ -216,7 +205,7 @@ float Lumobj::attenuation(double distFromEye) const return 1; } -void Lumobj::generateFlare(Vector3d const &eye, double distFromEye) +void Lumobj::generateFlare(Vector3d const &eye, ddouble distFromEye) { // Is the point in range? if(d->maxDistance > 0 && distFromEye > d->maxDistance) @@ -237,18 +226,18 @@ void Lumobj::generateFlare(Vector3d const &eye, double distFromEye) vis->data.flare.isDecoration = true; } -void Lumobj::consoleRegister() // static +dint Lumobj::radiusMax() // static { - C_VAR_INT ("rend-light-radius-max", &::radiusMax, 0, 64, 512); - C_VAR_FLOAT("rend-light-radius-scale", &::radiusScale, 0, .1f, 10); + return ::radiusMax; } -int Lumobj::radiusMax() // static +dfloat Lumobj::radiusFactor() // static { - return ::radiusMax; + return ::radiusScale; } -float Lumobj::radiusFactor() // static +void Lumobj::consoleRegister() // static { - return ::radiusScale; + C_VAR_INT ("rend-light-radius-max", &::radiusMax, 0, 64, 512); + C_VAR_FLOAT("rend-light-radius-scale", &::radiusScale, 0, .1f, 10); } diff --git a/doomsday/client/src/render/r_main.cpp b/doomsday/client/src/render/r_main.cpp index 7ed85cf7e7..7f9a354499 100644 --- a/doomsday/client/src/render/r_main.cpp +++ b/doomsday/client/src/render/r_main.cpp @@ -1,7 +1,7 @@ /** @file r_main.cpp * * @authors Copyright © 2003-2013 Jaakko Keränen - * @authors Copyright © 2006-2014 Daniel Swanson + * @authors Copyright © 2006-2015 Daniel Swanson * * @par License * GPL: http://www.gnu.org/licenses/gpl.html @@ -21,11 +21,14 @@ #include "de_platform.h" #include "render/r_main.h" +#include +#include #include "dd_def.h" // finesine #include "clientapp.h" #include "render/billboard.h" #include "render/rend_main.h" +#include "render/rend_model.h" #include "render/vissprite.h" #include "world/map.h" @@ -34,9 +37,6 @@ #include "ConvexSubspace" #include "SectorCluster" -#include -#include - using namespace de; dint levelFullBright; @@ -65,8 +65,7 @@ static inline ResourceSystem &resSys() static MaterialVariantSpec const &pspriteMaterialSpec() { - return resSys().materialSpec(PSpriteContext, 0, 1, 0, 0, - GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, + return resSys().materialSpec(PSpriteContext, 0, 1, 0, 0, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, 0, -2, 0, false, true, true, false); } @@ -155,7 +154,7 @@ static void setupPSpriteParams(rendpspriteparams_t *params, vispsprite_t *spr) Rend_ApplyTorchLight(params->ambientColor, 0); params->vLightListIdx = - Rend_CollectAffectingLights(Vector3d(spr->origin), Vector3f(params->ambientColor), + Rend_CollectAffectingLights(spr->origin, Vector3f(params->ambientColor), spr->data.sprite.bspLeaf->subspacePtr()); } } @@ -210,9 +209,7 @@ static void setupModelParamsForVisPSprite(vissprite_t &vis, vispsprite_t const * params->id = spr->data.model.id; params->selector = spr->data.model.selector; params->flags = spr->data.model.flags; - vis.pose.origin[0] = spr->origin[0]; - vis.pose.origin[1] = spr->origin[1]; - vis.pose.origin[2] = spr->origin[2]; + vis.pose.origin = spr->origin; vis.pose.srvo[0] = spr->data.model.visOff[0]; vis.pose.srvo[1] = spr->data.model.visOff[1]; vis.pose.srvo[2] = spr->data.model.visOff[2] - spr->data.model.floorClip; @@ -278,7 +275,7 @@ static void setupModelParamsForVisPSprite(vissprite_t &vis, vispsprite_t const * Rend_ApplyTorchLight(vis.light.ambientColor, vis.pose.distance); vis.light.vLightListIdx = - Rend_CollectAffectingLights(Vector3d(spr->origin), vis.light.ambientColor, + Rend_CollectAffectingLights(spr->origin, vis.light.ambientColor, spr->data.model.bspLeaf->subspacePtr(), true /*stark world light*/); } @@ -293,7 +290,7 @@ void Rend_Draw3DPlayerSprites() GLTarget::AlternativeBuffer altDepth(GLState::current().target(), localDepth, GLTarget::DepthStencil); - for(int i = 0; i < DDMAXPSPRITES; ++i) + for(dint i = 0; i < DDMAXPSPRITES; ++i) { vispsprite_t *spr = &visPSprites[i]; @@ -306,7 +303,7 @@ void Rend_Draw3DPlayerSprites() } //drawmodelparams_t parms; zap(parms); - vissprite_t temp; zap(temp); + vissprite_t temp; de::zap(temp); setupModelParamsForVisPSprite(temp, spr); Rend_DrawModel(temp); } diff --git a/doomsday/client/src/render/viewports.cpp b/doomsday/client/src/render/viewports.cpp index 1104df9c3a..223d830664 100644 --- a/doomsday/client/src/render/viewports.cpp +++ b/doomsday/client/src/render/viewports.cpp @@ -17,23 +17,37 @@ * http://www.gnu.org/licenses */ -#include "de_base.h" -#include "de_console.h" -#include "de_system.h" -#include "de_render.h" -#include "de_graphics.h" -#include "de_resource.h" -#include "de_ui.h" -#include "de_misc.h" +#include "de_platform.h" +#include "render/viewports.h" + +#include +#include +#include +#include +#include +#include + #include "clientapp.h" +#include "api_console.h" +#include "dd_main.h" +#include "dd_loop.h" #include "edit_bias.h" -#include "api_render.h" +#include "gl/gl_main.h" + +#include "api_render.h" +#include "render/r_draw.h" +#include "render/r_main.h" #include "render/fx/bloom.h" #include "render/angleclipper.h" +#include "render/cameralensfx.h" +#include "render/rendpoly.h" #include "render/skydrawable.h" +#include "render/vissprite.h" #include "render/vr.h" + #include "network/net_demo.h" + #include "world/linesighttest.h" #include "world/thinkers.h" #include "world/p_object.h" @@ -45,20 +59,17 @@ #include "Surface" #include "Contact" +#include "ui/ui_main.h" +#include "ui/clientwindow.h" #include "ui/widgets/gameuiwidget.h" -#include -#include -#include using namespace de; #ifdef LIBDENG_CAMERA_MOVEMENT_ANALYSIS -dfloat devCameraMovementStartTime; ///< sysTime +dfloat devCameraMovementStartTime; ///< sysTime dfloat devCameraMovementStartTimeRealSecs; #endif -D_CMD(ViewGrid); - dd_bool firstFrameAfterLoad; static dint loadInStartupMode; @@ -97,22 +108,7 @@ static inline WorldSystem &worldSys() return ClientApp::worldSystem(); } -void Viewports_Register() -{ - C_VAR_INT ("con-show-during-setup", &loadInStartupMode, 0, 0, 1); - - C_VAR_INT ("rend-camera-smooth", &rendCameraSmooth, CVF_HIDE, 0, 1); - - C_VAR_BYTE("rend-info-deltas-angles", &showViewAngleDeltas, 0, 0, 1); - C_VAR_BYTE("rend-info-deltas-pos", &showViewPosDeltas, 0, 0, 1); - C_VAR_BYTE("rend-info-frametime", &showFrameTimePos, 0, 0, 1); - C_VAR_BYTE("rend-info-rendpolys", &rendInfoRPolys, CVF_NO_ARCHIVE, 0, 1); - //C_VAR_INT ("rend-info-tris", &rendInfoTris, 0, 0, 1); // not implemented atm - - C_CMD("viewgrid", "ii", ViewGrid); -} - -int R_FrameCount() +dint R_FrameCount() { return frameCount; } @@ -123,27 +119,27 @@ void R_ResetFrameCount() } #undef R_SetViewOrigin -DENG_EXTERN_C void R_SetViewOrigin(int consoleNum, coord_t const origin[3]) +DENG_EXTERN_C void R_SetViewOrigin(dint consoleNum, coord_t const origin[3]) { if(consoleNum < 0 || consoleNum >= DDMAXPLAYERS) return; viewDataOfConsole[consoleNum].latest.origin = Vector3d(origin); } #undef R_SetViewAngle -DENG_EXTERN_C void R_SetViewAngle(int consoleNum, angle_t angle) +DENG_EXTERN_C void R_SetViewAngle(dint consoleNum, angle_t angle) { if(consoleNum < 0 || consoleNum >= DDMAXPLAYERS) return; viewDataOfConsole[consoleNum].latest.setAngle(angle); } #undef R_SetViewPitch -DENG_EXTERN_C void R_SetViewPitch(int consoleNum, float pitch) +DENG_EXTERN_C void R_SetViewPitch(dint consoleNum, dfloat pitch) { if(consoleNum < 0 || consoleNum >= DDMAXPLAYERS) return; viewDataOfConsole[consoleNum].latest.pitch = pitch; } -void R_SetupDefaultViewWindow(int consoleNum) +void R_SetupDefaultViewWindow(dint consoleNum) { viewdata_t *vd = &viewDataOfConsole[consoleNum]; if(consoleNum < 0 || consoleNum >= DDMAXPLAYERS) return; @@ -154,7 +150,7 @@ void R_SetupDefaultViewWindow(int consoleNum) vd->windowInter = 1; } -void R_ViewWindowTicker(int consoleNum, timespan_t ticLength) +void R_ViewWindowTicker(dint consoleNum, timespan_t ticLength) { viewdata_t *vd = &viewDataOfConsole[consoleNum]; if(consoleNum < 0 || consoleNum >= DDMAXPLAYERS) @@ -162,22 +158,22 @@ void R_ViewWindowTicker(int consoleNum, timespan_t ticLength) return; } - vd->windowInter += float(.4 * ticLength * TICRATE); + vd->windowInter += dfloat(.4 * ticLength * TICRATE); if(vd->windowInter >= 1) { vd->window = vd->windowTarget; } else { - vd->window.moveTopLeft(Vector2i(de::roundf(de::lerp(vd->windowOld.topLeft.x, vd->windowTarget.topLeft.x, vd->windowInter)), - de::roundf(de::lerp(vd->windowOld.topLeft.y, vd->windowTarget.topLeft.y, vd->windowInter)))); - vd->window.setSize(Vector2ui(de::roundf(de::lerp(vd->windowOld.width(), vd->windowTarget.width(), vd->windowInter)), - de::roundf(de::lerp(vd->windowOld.height(), vd->windowTarget.height(), vd->windowInter)))); + vd->window.moveTopLeft(Vector2i(de::roundf(de::lerp(vd->windowOld.topLeft.x, vd->windowTarget.topLeft.x, vd->windowInter)), + de::roundf(de::lerp(vd->windowOld.topLeft.y, vd->windowTarget.topLeft.y, vd->windowInter)))); + vd->window.setSize(Vector2ui(de::roundf(de::lerp(vd->windowOld.width(), vd->windowTarget.width(), vd->windowInter)), + de::roundf(de::lerp(vd->windowOld.height(), vd->windowTarget.height(), vd->windowInter)))); } } #undef R_ViewWindowGeometry -DENG_EXTERN_C int R_ViewWindowGeometry(int player, RectRaw *geometry) +DENG_EXTERN_C dint R_ViewWindowGeometry(dint player, RectRaw *geometry) { if(!geometry) return false; if(player < 0 || player >= DDMAXPLAYERS) return false; @@ -191,7 +187,7 @@ DENG_EXTERN_C int R_ViewWindowGeometry(int player, RectRaw *geometry) } #undef R_ViewWindowOrigin -DENG_EXTERN_C int R_ViewWindowOrigin(int player, Point2Raw *origin) +DENG_EXTERN_C dint R_ViewWindowOrigin(dint player, Point2Raw *origin) { if(!origin) return false; if(player < 0 || player >= DDMAXPLAYERS) return false; @@ -203,7 +199,7 @@ DENG_EXTERN_C int R_ViewWindowOrigin(int player, Point2Raw *origin) } #undef R_ViewWindowSize -DENG_EXTERN_C int R_ViewWindowSize(int player, Size2Raw *size) +DENG_EXTERN_C dint R_ViewWindowSize(dint player, Size2Raw *size) { if(!size) return false; if(player < 0 || player >= DDMAXPLAYERS) return false; @@ -220,16 +216,16 @@ DENG_EXTERN_C int R_ViewWindowSize(int player, Size2Raw *size) * refresh only. */ #undef R_SetViewWindowGeometry -DENG_EXTERN_C void R_SetViewWindowGeometry(int player, RectRaw const *geometry, dd_bool interpolate) +DENG_EXTERN_C void R_SetViewWindowGeometry(dint player, RectRaw const *geometry, dd_bool interpolate) { - int p = P_ConsoleToLocal(player); + dint p = P_ConsoleToLocal(player); if(p < 0) return; viewport_t const *vp = &viewportOfLocalPlayer[p]; viewdata_t *vd = &viewDataOfConsole[player]; - Rectanglei newGeom = Rectanglei::fromSize(Vector2i(de::clamp(0, geometry->origin.x, vp->geometry.width()), - de::clamp(0, geometry->origin.y, vp->geometry.height())), + Rectanglei newGeom = Rectanglei::fromSize(Vector2i(de::clamp(0, geometry->origin.x, vp->geometry.width()), + de::clamp(0, geometry->origin.y, vp->geometry.height())), Vector2ui(de::abs(geometry->size.width), de::abs(geometry->size.height))); @@ -261,16 +257,16 @@ DENG_EXTERN_C void R_SetViewWindowGeometry(int player, RectRaw const *geometry, else { vd->windowOld = vd->windowTarget; - vd->windowInter = 1; // Update on next frame. + vd->windowInter = 1; // Update on next frame. } } #undef R_ViewPortGeometry -DENG_EXTERN_C int R_ViewPortGeometry(int player, RectRaw *geometry) +DENG_EXTERN_C dint R_ViewPortGeometry(dint player, RectRaw *geometry) { if(!geometry) return false; - int p = P_ConsoleToLocal(player); + dint p = P_ConsoleToLocal(player); if(p == -1) return false; viewport_t const &vp = viewportOfLocalPlayer[p]; @@ -282,11 +278,11 @@ DENG_EXTERN_C int R_ViewPortGeometry(int player, RectRaw *geometry) } #undef R_ViewPortOrigin -DENG_EXTERN_C int R_ViewPortOrigin(int player, Point2Raw *origin) +DENG_EXTERN_C dint R_ViewPortOrigin(dint player, Point2Raw *origin) { if(!origin) return false; - int p = P_ConsoleToLocal(player); + dint p = P_ConsoleToLocal(player); if(p == -1) return false; viewport_t const &vp = viewportOfLocalPlayer[p]; @@ -296,11 +292,11 @@ DENG_EXTERN_C int R_ViewPortOrigin(int player, Point2Raw *origin) } #undef R_ViewPortSize -DENG_EXTERN_C int R_ViewPortSize(int player, Size2Raw *size) +DENG_EXTERN_C dint R_ViewPortSize(dint player, Size2Raw *size) { if(!size) return false; - int p = P_ConsoleToLocal(player); + dint p = P_ConsoleToLocal(player); if(p == -1) return false; viewport_t const &vp = viewportOfLocalPlayer[p]; @@ -310,9 +306,9 @@ DENG_EXTERN_C int R_ViewPortSize(int player, Size2Raw *size) } #undef R_SetViewPortPlayer -DENG_EXTERN_C void R_SetViewPortPlayer(int consoleNum, int viewPlayer) +DENG_EXTERN_C void R_SetViewPortPlayer(dint consoleNum, dint viewPlayer) { - int p = P_ConsoleToLocal(consoleNum); + dint p = P_ConsoleToLocal(consoleNum); if(p != -1) { viewportOfLocalPlayer[p].console = viewPlayer; @@ -323,9 +319,9 @@ DENG_EXTERN_C void R_SetViewPortPlayer(int consoleNum, int viewPlayer) * Calculate the placement and dimensions of a specific viewport. * Assumes that the grid has already been configured. */ -void R_UpdateViewPortGeometry(viewport_t *port, int col, int row) +void R_UpdateViewPortGeometry(viewport_t *port, dint col, dint row) { - DENG2_ASSERT(port != 0); + DENG2_ASSERT(port); Rectanglei newGeom = Rectanglei(Vector2i(DENG_GAMEVIEW_X + col * DENG_GAMEVIEW_WIDTH / gridCols, DENG_GAMEVIEW_Y + row * DENG_GAMEVIEW_HEIGHT / gridRows), @@ -354,11 +350,11 @@ void R_UpdateViewPortGeometry(viewport_t *port, int col, int row) p.geometry.size.width = port->geometry.width(); p.geometry.size.height = port->geometry.height(); - DD_CallHooks(HOOK_VIEWPORT_RESHAPE, port->console, (void*)&p); + DD_CallHooks(HOOK_VIEWPORT_RESHAPE, port->console, (void *)&p); } } -bool R_SetViewGrid(int numCols, int numRows) +bool R_SetViewGrid(dint numCols, dint numRows) { if(numCols > 0 && numRows > 0) { @@ -384,14 +380,14 @@ bool R_SetViewGrid(int numCols, int numRows) gridRows = numRows; } - int p = 0; - for(int y = 0; y < gridRows; ++y) - for(int x = 0; x < gridCols; ++x) + dint p = 0; + for(dint y = 0; y < gridRows; ++y) + for(dint x = 0; x < gridCols; ++x) { // The console number is -1 if the viewport belongs to no one. - viewport_t *vp = viewportOfLocalPlayer + p; + viewport_t *vp = &viewportOfLocalPlayer[p]; - int const console = P_LocalToConsole(p); + dint const console = P_LocalToConsole(p); if(console != -1) { vp->console = clients[console].viewConsole; @@ -413,12 +409,12 @@ void R_ResetViewer() resetNextViewer = 1; } -int R_NextViewer() +dint R_NextViewer() { return resetNextViewer; } -viewdata_t const *R_ViewData(int consoleNum) +viewdata_t const *R_ViewData(dint consoleNum) { DENG2_ASSERT(consoleNum >= 0 && consoleNum < DDMAXPLAYERS); return &viewDataOfConsole[consoleNum]; @@ -430,7 +426,7 @@ viewdata_t const *R_ViewData(int consoleNum) */ void R_CheckViewerLimits(viewer_t *src, viewer_t *dst) { - int const MAXMOVE = 32; + dint const MAXMOVE = 32; /// @todo Remove this snapping. The game should determine this and disable the /// the interpolation as required. @@ -441,7 +437,7 @@ void R_CheckViewerLimits(viewer_t *src, viewer_t *dst) } /* - if(abs(int(dst->angle) - int(src->angle)) >= ANGLE_45) + if(abs(dint(dst->angle) - dint(src->angle)) >= ANGLE_45) { LOG_DEBUG("R_CheckViewerLimits: Snap camera angle to %08x.") << dst->angle; src->angle = dst->angle; @@ -454,7 +450,7 @@ void R_CheckViewerLimits(viewer_t *src, viewer_t *dst) */ viewer_t R_SharpViewer(player_t &player) { - DENG2_ASSERT(player.shared.mo != 0); + DENG2_ASSERT(player.shared.mo); ddplayer_t const &ddpl = player.shared; @@ -462,15 +458,14 @@ viewer_t R_SharpViewer(player_t &player) if((ddpl.flags & DDPF_CHASECAM) && !(ddpl.flags & DDPF_CAMERA)) { - /* STUB - * This needs to be fleshed out with a proper third person - * camera control setup. Currently we simply project the viewer's - * position a set distance behind the ddpl. - */ - float const distance = 90; + // STUB + // This needs to be fleshed out with a proper third person + // camera control setup. Currently we simply project the viewer's + // position a set distance behind the ddpl. + dfloat const distance = 90; - uint angle = view.angle() >> ANGLETOFINESHIFT; - uint pitch = angle_t(LOOKDIR2DEG(view.pitch) / 360 * ANGLE_MAX) >> ANGLETOFINESHIFT; + duint angle = view.angle() >> ANGLETOFINESHIFT; + duint pitch = angle_t(LOOKDIR2DEG(view.pitch) / 360 * ANGLE_MAX) >> ANGLETOFINESHIFT; view.origin -= Vector3d(FIX2FLT(fineCosine[angle]), FIX2FLT(finesine[angle]), @@ -502,10 +497,10 @@ void R_NewSharpWorld() resetNextViewer = 2; } - for(int i = 0; i < DDMAXPLAYERS; ++i) + for(dint i = 0; i < DDMAXPLAYERS; ++i) { viewdata_t *vd = &viewDataOfConsole[i]; - player_t *plr = &ddPlayers[i]; + player_t *plr = &ddPlayers[i]; if(/*(plr->shared.flags & DDPF_LOCAL) &&*/ (!plr->shared.inGame || !plr->shared.mo)) @@ -536,11 +531,11 @@ void R_NewSharpWorld() } } -void R_UpdateViewer(int consoleNum) +void R_UpdateViewer(dint consoleNum) { - DENG_ASSERT(consoleNum >= 0 && consoleNum < DDMAXPLAYERS); + DENG2_ASSERT(consoleNum >= 0 && consoleNum < DDMAXPLAYERS); - int const VIEWPOS_MAX_SMOOTHDISTANCE = 172; + dint const VIEWPOS_MAX_SMOOTHDISTANCE = 172; viewdata_t *vd = viewDataOfConsole + consoleNum; player_t *player = ddPlayers + consoleNum; @@ -566,7 +561,7 @@ void R_UpdateViewer(int consoleNum) } // While the game is paused there is no need to calculate any // time offsets or interpolated camera positions. - else //if(!clientPaused) + else //if(!clientPaused) { // Calculate the smoothed camera position, which is somewhere between // the previous and current sharp positions. This introduces a slight @@ -588,13 +583,14 @@ void R_UpdateViewer(int consoleNum) if(showViewAngleDeltas) { struct OldAngle { - double time; - float yaw, pitch; + ddouble time; + dfloat yaw; + dfloat pitch; }; static OldAngle oldAngle[DDMAXPLAYERS]; OldAngle *old = &oldAngle[viewPlayer - ddPlayers]; - float yaw = (double)smoothView.angle() / ANGLE_MAX * 360; + dfloat yaw = (ddouble)smoothView.angle() / ANGLE_MAX * 360; LOGDEV_MSG("(%i) F=%.3f dt=%-10.3f dx=%-10.3f dy=%-10.3f " "Rdx=%-10.3f Rdy=%-10.3f") @@ -615,7 +611,7 @@ void R_UpdateViewer(int consoleNum) if(showViewPosDeltas) { struct OldPos { - double time; + ddouble time; Vector3f pos; }; @@ -640,13 +636,13 @@ void R_UpdateViewer(int consoleNum) // Update viewer. angle_t const viewYaw = vd->current.angle(); - uint const an = viewYaw >> ANGLETOFINESHIFT; + duint const an = viewYaw >> ANGLETOFINESHIFT; vd->viewSin = FIX2FLT(finesine[an]); vd->viewCos = FIX2FLT(fineCosine[an]); // Calculate the front, up and side unit vectors. - float const yawRad = ((viewYaw / (float) ANGLE_MAX) *2) * PI; - float const pitchRad = vd->current.pitch * 85 / 110.f / 180 * PI; + dfloat const yawRad = ((viewYaw / (dfloat) ANGLE_MAX) *2) * PI; + dfloat const pitchRad = vd->current.pitch * 85 / 110.f / 180 * PI; // The front vector. vd->frontVec.x = cos(yawRad) * cos(pitchRad); @@ -699,7 +695,7 @@ void R_SetupFrame(player_t *player) // Why? validCount++; - extraLight = player->extraLight; + extraLight = player->extraLight; extraLightDelta = extraLight / 16.0f; if(!freezeRLs) @@ -722,7 +718,7 @@ void R_UseViewPort(viewport_t const *vp) if(!vp) { - currentViewport = 0; + currentViewport = nullptr; ClientWindow::main().game().glApplyViewport( Rectanglei::fromSize(Vector2i(DENG_GAMEVIEW_X, DENG_GAMEVIEW_Y), Vector2ui(DENG_GAMEVIEW_WIDTH, DENG_GAMEVIEW_HEIGHT))); @@ -753,20 +749,18 @@ static void setupPlayerSprites() if((ddpl->flags & DDPF_CAMERA) || (ddpl->flags & DDPF_CHASECAM)) return; - if(!ddpl->mo) - return; - mobj_t *mo = ddpl->mo; + if(!ddpl->mo) return; + mobj_t *mob = ddpl->mo; - if(!Mobj_HasSubspace(*mo)) - return; - SectorCluster &cluster = Mobj_Cluster(*mo); + if(!Mobj_HasSubspace(*mob)) return; + SectorCluster &cluster = Mobj_Cluster(*mob); // Determine if we should be drawing all the psprites full bright? dd_bool isFullBright = (levelFullBright != 0); if(!isFullBright) { ddpsprite_t *psp = ddpl->pSprites; - for(int i = 0; i < DDMAXPSPRITES; ++i, psp++) + for(dint i = 0; i < DDMAXPSPRITES; ++i, psp++) { if(!psp->statePtr) continue; @@ -779,19 +773,19 @@ static void setupPlayerSprites() viewdata_t const *viewData = R_ViewData(viewPlayer - ddPlayers); ddpsprite_t *psp = ddpl->pSprites; - for(int i = 0; i < DDMAXPSPRITES; ++i, psp++) + for(dint i = 0; i < DDMAXPSPRITES; ++i, psp++) { vispsprite_t *spr = &visPSprites[i]; spr->type = VPSPR_SPRITE; - spr->psp = psp; + spr->psp = psp; if(!psp->statePtr) continue; // First, determine whether this is a model or a sprite. bool isModel = false; - ModelDef *mf = 0, *nextmf = 0; - float inter = 0; + ModelDef *mf = nullptr, *nextmf = nullptr; + dfloat inter = 0; if(useModels) { // Is there a model for this frame? @@ -811,37 +805,35 @@ static void setupPlayerSprites() // There are 3D psprites. psp3d = true; - spr->type = VPSPR_MODEL; + spr->type = VPSPR_MODEL; + spr->origin = viewData->current.origin; - spr->data.model.bspLeaf = &Mobj_BspLeafAtOrigin(*mo); - spr->data.model.flags = 0; + spr->data.model.bspLeaf = &Mobj_BspLeafAtOrigin(*mob); + spr->data.model.flags = 0; // 32 is the raised weapon height. - spr->data.model.topZ = viewData->current.origin.z; - spr->data.model.secFloor = cluster.visFloor().heightSmoothed(); - spr->data.model.secCeil = cluster.visCeiling().heightSmoothed(); - 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.topZ = viewData->current.origin.z; + spr->data.model.secFloor = cluster.visFloor().heightSmoothed(); + spr->data.model.secCeil = cluster.visCeiling().heightSmoothed(); + 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.x; - spr->origin[VY] = viewData->current.origin.y; - spr->origin[VZ] = viewData->current.origin.z; // Offsets to rotation angles. - spr->data.model.yawAngleOffset = psp->pos[VX] * weaponOffsetScale - 90; + spr->data.model.yawAngleOffset = psp->pos[0] * weaponOffsetScale - 90; spr->data.model.pitchAngleOffset = - (32 - psp->pos[VY]) * weaponOffsetScale * weaponOffsetScaleY / 1000.0f; + (32 - psp->pos[1]) * weaponOffsetScale * weaponOffsetScaleY / 1000.0f; // Is the FOV shift in effect? if(weaponFOVShift > 0 && Rend_FieldOfView() > 90) spr->data.model.pitchAngleOffset -= weaponFOVShift * (Rend_FieldOfView() - 90) / 90; // Real rotation angles. spr->data.model.yaw = - viewData->current.angle() / (float) ANGLE_MAX *-360 + spr->data.model.yawAngleOffset + 90; + viewData->current.angle() / (dfloat) 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)); + std::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; @@ -852,13 +844,11 @@ static void setupPlayerSprites() spr->type = VPSPR_SPRITE; // Adjust the center slightly so an angle can be calculated. - spr->origin[VX] = viewData->current.origin.x; - spr->origin[VY] = viewData->current.origin.y; - spr->origin[VZ] = viewData->current.origin.z; + spr->origin = viewData->current.origin; - spr->data.sprite.bspLeaf = &Mobj_BspLeafAtOrigin(*mo); - spr->data.sprite.alpha = psp->alpha; - spr->data.sprite.isFullBright = (psp->flags & DDPSPF_FULLBRIGHT)!=0; + spr->data.sprite.bspLeaf = &Mobj_BspLeafAtOrigin(*mob); + spr->data.sprite.alpha = psp->alpha; + spr->data.sprite.isFullBright = (psp->flags & DDPSPF_FULLBRIGHT) != 0; } } } @@ -878,7 +868,7 @@ Matrix4f const &Viewer_Matrix() } #undef R_RenderPlayerView -DENG_EXTERN_C void R_RenderPlayerView(int num) +DENG_EXTERN_C void R_RenderPlayerView(dint num) { if(num < 0 || num >= DDMAXPLAYERS) return; // Huh? player_t *player = &ddPlayers[num]; @@ -916,7 +906,7 @@ DENG_EXTERN_C void R_RenderPlayerView(int num) } // Hide the viewPlayer's mobj? - int oldFlags = 0; + dint oldFlags = 0; if(!(player->shared.flags & DDPF_CHASECAM)) { oldFlags = player->shared.mo->ddFlags; @@ -946,7 +936,7 @@ DENG_EXTERN_C void R_RenderPlayerView(int num) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } - Rend_Draw2DPlayerSprites(); // If the 2D versions are needed. + Rend_Draw2DPlayerSprites(); // If the 2D versions are needed. if(renderWireframe) { @@ -979,14 +969,14 @@ DENG_EXTERN_C void R_RenderPlayerView(int num) #ifdef LIBDENG_CAMERA_MOVEMENT_ANALYSIS { - static float prevPos[3] = { 0, 0, 0 }; - static float prevSpeed = 0; - static float prevTime; - float delta[2] = { vd->current.pos[VX] - prevPos[VX], - vd->current.pos[VY] - prevPos[VY] }; - float speed = V2f_Length(delta); - float time = sysTime - devCameraMovementStartTime; - float elapsed = time - prevTime; + static dfloat prevPos[3] = { 0, 0, 0 }; + static dfloat prevSpeed = 0; + static dfloat prevTime; + dfloat delta[2] = { vd->current.pos[0] - prevPos[0], + vd->current.pos[1] - prevPos[1] }; + dfloat speed = V2f_Length(delta); + dfloat time = sysTime - devCameraMovementStartTime; + dfloat elapsed = time - prevTime; LOGDEV_MSG("%f,%f,%f,%f,%f") << Sys_GetRealSeconds() - devCameraMovementStartTimeRealSecs << time << elapsed << speed/elapsed << speed/elapsed - prevSpeed; @@ -1023,12 +1013,10 @@ static void clearViewPorts() (App_InFineSystem().finaleInProgess() && !GameUIWidget::finaleStretch()) || ClientApp::vr().mode() == VRConfig::OculusRift) { - /* - * Parts of the previous frame might leak in the bloom unless we clear the color - * buffer. Not doing this would result in very bright HOMs in map holes and game - * UI elements glowing in the frame (UI elements are normally on a separate layer - * and should not affect bloom). - */ + // Parts of the previous frame might leak in the bloom unless we clear the color + // buffer. Not doing this would result in very bright HOMs in map holes and game + // UI elements glowing in the frame (UI elements are normally on a separate layer + // and should not affect bloom). bits |= GL_COLOR_BUFFER_BIT; } @@ -1041,7 +1029,7 @@ static void clearViewPorts() } else { - for(int i = 0; i < DDMAXPLAYERS; ++i) + for(dint i = 0; i < DDMAXPLAYERS; ++i) { player_t *plr = &ddPlayers[i]; @@ -1065,7 +1053,7 @@ static void clearViewPorts() void R_RenderViewPorts(ViewPortLayer layer) { - int oldDisplay = displayPlayer; + dint oldDisplay = displayPlayer; // First clear the viewport. if(layer == Player3DViewLayer) @@ -1074,63 +1062,59 @@ void R_RenderViewPorts(ViewPortLayer layer) } // Draw a view for all players with a visible viewport. - for(int p = 0, y = 0; y < gridRows; ++y) + for(dint p = 0, y = 0; y < gridRows; ++y) + for(dint x = 0; x < gridCols; x++, ++p) { - for(int x = 0; x < gridCols; x++, ++p) - { - viewport_t const *vp = &viewportOfLocalPlayer[p]; - displayPlayer = vp->console; + viewport_t const *vp = &viewportOfLocalPlayer[p]; - R_UseViewPort(vp); + displayPlayer = vp->console; + R_UseViewPort(vp); - if(displayPlayer < 0 || (ddPlayers[displayPlayer].shared.flags & DDPF_UNDEFINED_ORIGIN)) + if(displayPlayer < 0 || (ddPlayers[displayPlayer].shared.flags & DDPF_UNDEFINED_ORIGIN)) + { + if(layer == Player3DViewLayer) { - if(layer == Player3DViewLayer) - { - R_RenderBlankView(); - } - continue; + R_RenderBlankView(); } + continue; + } - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - - /** - * Use an orthographic projection in real pixel dimensions. - */ - glOrtho(0, vp->geometry.width(), vp->geometry.height(), 0, -1, 1); - - viewdata_t const *vd = &viewDataOfConsole[vp->console]; - RectRaw vpGeometry(vp->geometry.topLeft.x, vp->geometry.topLeft.y, - vp->geometry.width(), vp->geometry.height()); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); - RectRaw vdWindow(vd->window.topLeft.x, vd->window.topLeft.y, - vd->window.width(), vd->window.height()); + // Use an orthographic projection in real pixel dimensions. + glOrtho(0, vp->geometry.width(), vp->geometry.height(), 0, -1, 1); - switch(layer) - { - case Player3DViewLayer: - R_UpdateViewer(vp->console); - LensFx_BeginFrame(vp->console); - gx.DrawViewPort(p, &vpGeometry, &vdWindow, displayPlayer, 0/*layer #0*/); - LensFx_EndFrame(); - break; + viewdata_t const *vd = &viewDataOfConsole[vp->console]; + RectRaw vpGeometry(vp->geometry.topLeft.x, vp->geometry.topLeft.y, + vp->geometry.width(), vp->geometry.height()); - case ViewBorderLayer: - R_RenderPlayerViewBorder(); - break; + RectRaw vdWindow(vd->window.topLeft.x, vd->window.topLeft.y, + vd->window.width(), vd->window.height()); - case HUDLayer: - gx.DrawViewPort(p, &vpGeometry, &vdWindow, displayPlayer, 1/*layer #1*/); - break; - } + switch(layer) + { + case Player3DViewLayer: + R_UpdateViewer(vp->console); + LensFx_BeginFrame(vp->console); + gx.DrawViewPort(p, &vpGeometry, &vdWindow, displayPlayer, 0/*layer #0*/); + LensFx_EndFrame(); + break; + + case ViewBorderLayer: + R_RenderPlayerViewBorder(); + break; + + case HUDLayer: + gx.DrawViewPort(p, &vpGeometry, &vdWindow, displayPlayer, 1/*layer #1*/); + break; + } - restoreDefaultGLState(); + restoreDefaultGLState(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - } + glMatrixMode(GL_PROJECTION); + glPopMatrix(); } if(layer == Player3DViewLayer) @@ -1146,14 +1130,14 @@ void R_RenderViewPorts(ViewPortLayer layer) // Restore things back to normal. displayPlayer = oldDisplay; - R_UseViewPort(NULL); + R_UseViewPort(nullptr); } void R_ClearViewData() { - M_Free(luminousDist); luminousDist = 0; - M_Free(luminousClipped); luminousClipped = 0; - M_Free(luminousOrder); luminousOrder = 0; + M_Free(luminousDist); luminousDist = nullptr; + M_Free(luminousClipped); luminousClipped = nullptr; + M_Free(luminousOrder); luminousOrder = nullptr; } /** @@ -1163,7 +1147,7 @@ void R_ClearViewData() * thank for this nonsense (Hexen's sector special 200)... -ds */ #undef R_SkyParams -DENG_EXTERN_C void R_SkyParams(int layerIndex, int param, void * /*data*/) +DENG_EXTERN_C void R_SkyParams(dint layerIndex, dint param, void * /*data*/) { LOG_AS("R_SkyParams"); if(!worldSys().hasMap()) @@ -1213,7 +1197,7 @@ void R_ViewerGeneratorMarkVisible(Generator const &generator, bool yes) generatorsVisible.setBit(generator.id() - 1 /* id is 1-based index */, yes); } -double R_ViewerLumobjDistance(int idx) +ddouble R_ViewerLumobjDistance(dint idx) { /// @todo Do not assume the current map. if(idx >= 0 && idx < worldSys().map().lumobjCount()) @@ -1223,7 +1207,7 @@ double R_ViewerLumobjDistance(int idx) return 0; } -bool R_ViewerLumobjIsClipped(int idx) +bool R_ViewerLumobjIsClipped(dint idx) { // If we are not yet prepared for this, just say everything is clipped. if(!luminousClipped) return true; @@ -1236,7 +1220,7 @@ bool R_ViewerLumobjIsClipped(int idx) return false; } -bool R_ViewerLumobjIsHidden(int idx) +bool R_ViewerLumobjIsHidden(dint idx) { // If we are not yet prepared for this, just say everything is hidden. if(!luminousClipped) return true; @@ -1251,16 +1235,16 @@ bool R_ViewerLumobjIsHidden(int idx) static void markLumobjClipped(Lumobj const &lob, bool yes = true) { - int const index = lob.indexInMap(); + dint const index = lob.indexInMap(); DENG2_ASSERT(index >= 0 && index < lob.map().lumobjCount()); luminousClipped[index] = yes? 1 : 0; } /// Used to sort lumobjs by distance from viewpoint. -static int lumobjSorter(void const *e1, void const *e2) +static dint lumobjSorter(void const *e1, void const *e2) { - coord_t a = luminousDist[*(uint const *) e1]; - coord_t b = luminousDist[*(uint const *) e2]; + coord_t a = luminousDist[*(duint const *) e1]; + coord_t b = luminousDist[*(duint const *) e2]; if(a > b) return 1; if(a < b) return -1; return 0; @@ -1339,8 +1323,7 @@ void R_ViewerClipLumobj(Lumobj *lum) markLumobjClipped(*lum, false); /// @todo Determine the exact centerpoint of the light in addLuminous! - Vector3d origin = lum->origin(); - origin.z += lum->zOffset(); + Vector3d const origin(lum->x(), lum->y(), lum->z() + lum->zOffset()); if(!(devNoCulling || P_IsInVoid(&ddPlayers[displayPlayer]))) { @@ -1400,13 +1383,6 @@ void R_ViewerClipLumobjBySight(Lumobj *lob, ConvexSubspace *subspace) }); } -D_CMD(ViewGrid) -{ - DENG2_UNUSED2(src, argc); - // Recalculate viewports. - return R_SetViewGrid(String(argv[1]).toInt(), String(argv[2]).toInt()); -} - angle_t viewer_t::angle() const { angle_t a = _angle; @@ -1414,7 +1390,29 @@ angle_t viewer_t::angle() const { // Apply the actual, current yaw offset. The game has omitted the "body yaw" // portion from the value already. - a += (fixed_t)(radianToDegree(vrCfg().oculusRift().headOrientation()[2]) / 180 * ANGLE_180); + a += fixed_t(radianToDegree(vrCfg().oculusRift().headOrientation().z) / 180 * ANGLE_180); } return a; } + +D_CMD(ViewGrid) +{ + DENG2_UNUSED2(src, argc); + // Recalculate viewports. + return R_SetViewGrid(String(argv[1]).toInt(), String(argv[2]).toInt()); +} + +void Viewports_Register() +{ + C_VAR_INT ("con-show-during-setup", &loadInStartupMode, 0, 0, 1); + + C_VAR_INT ("rend-camera-smooth", &rendCameraSmooth, CVF_HIDE, 0, 1); + + C_VAR_BYTE("rend-info-deltas-angles", &showViewAngleDeltas, 0, 0, 1); + C_VAR_BYTE("rend-info-deltas-pos", &showViewPosDeltas, 0, 0, 1); + C_VAR_BYTE("rend-info-frametime", &showFrameTimePos, 0, 0, 1); + C_VAR_BYTE("rend-info-rendpolys", &rendInfoRPolys, CVF_NO_ARCHIVE, 0, 1); + //C_VAR_INT ("rend-info-tris", &rendInfoTris, 0, 0, 1); // not implemented atm + + C_CMD("viewgrid", "ii", ViewGrid); +} diff --git a/doomsday/client/src/render/vissprite.cpp b/doomsday/client/src/render/vissprite.cpp index 1547f4a242..21936cdf2f 100644 --- a/doomsday/client/src/render/vissprite.cpp +++ b/doomsday/client/src/render/vissprite.cpp @@ -1,7 +1,7 @@ -/** @file vissprite.cpp Projected visible sprite ("vissprite") management. +/** @file vissprite.cpp Projected visible sprite ("vissprite") management. * * @authors Copyright © 2003-2013 Jaakko Keränen - * @authors Copyright © 2006-2013 Daniel Swanson + * @authors Copyright © 2006-2015 Daniel Swanson * @authors Copyright © 2006 Jamie Jones * @authors Copyright © 1993-1996 by id Software, Inc. * @@ -21,9 +21,6 @@ */ #include "de_base.h" -#include "de_render.h" -#include "de_resource.h" - #include "render/vissprite.h" using namespace de; @@ -55,16 +52,16 @@ vissprite_t *R_NewVisSprite(visspritetype_t type) spr = visSpriteP - 1; } - zapPtr(spr); + de::zapPtr(spr); spr->type = type; return spr; } void VisSprite_SetupSprite(vissprite_t *spr, VisEntityPose const &pose, VisEntityLighting const &light, - float /*secFloor*/, float /*secCeil*/, float /*floorClip*/, float /*top*/, + dfloat /*secFloor*/, dfloat /*secCeil*/, dfloat /*floorClip*/, dfloat /*top*/, Material &material, bool matFlipS, bool matFlipT, blendmode_t blendMode, - int tClass, int tMap, BspLeaf *bspLeafAtOrigin, + dint tClass, dint tMap, BspLeaf *bspLeafAtOrigin, bool /*floorAdjust*/, bool /*fitTop*/, bool /*fitBottom*/) { drawspriteparams_t &p = *VS_SPRITE(spr); @@ -76,21 +73,21 @@ void VisSprite_SetupSprite(vissprite_t *spr, VisEntityPose const &pose, VisEntit (spec.primarySpec->variant.flags & TSF_HAS_COLORPALETTE_XLAT)); spr->pose = pose; - p.bspLeaf = bspLeafAtOrigin; - p.noZWrite = noSpriteZWrite; + p.bspLeaf = bspLeafAtOrigin; + p.noZWrite = noSpriteZWrite; - p.matAnimator = matAnimator; - p.matFlip[0] = matFlipS; - p.matFlip[1] = matFlipT; - p.blendMode = (useSpriteBlend? blendMode : BM_NORMAL); + p.matAnimator = matAnimator; + p.matFlip[0] = matFlipS; + p.matFlip[1] = matFlipT; + p.blendMode = (useSpriteBlend? blendMode : BM_NORMAL); spr->light = light; spr->light.ambientColor[3] = (useSpriteAlpha? light.ambientColor.w : 1); } void VisSprite_SetupModel(vissprite_t *spr, VisEntityPose const &pose, VisEntityLighting const &light, - ModelDef *mf, ModelDef *nextMF, float inter, - int id, int selector, BspLeaf * /*bspLeafAtOrigin*/, int mobjDDFlags, int tmap, + ModelDef *mf, ModelDef *nextMF, dfloat inter, + dint id, dint selector, BspLeaf * /*bspLeafAtOrigin*/, dint mobjDDFlags, dint tmap, bool /*fullBright*/, bool alwaysInterpolate) { drawmodelparams_t &p = *VS_MODEL(spr); @@ -115,7 +112,7 @@ void R_SortVisSprites() { if(!visSpriteP) return; - int const count = visSpriteP - visSprites; + dint const count = visSpriteP - visSprites; if(!count) return; vissprite_t unsorted; @@ -134,19 +131,17 @@ void R_SortVisSprites() // Pull the vissprites out by distance. visSprSortedHead.next = visSprSortedHead.prev = &visSprSortedHead; - /** - * @todo Optimize: - * Profile results from nuts.wad show over 25% of total execution time - * was spent sorting vissprites (nuts.wad map01 is a perfect pathological - * test case). - * - * Rather than try to speed up the sort, it would make more sense to - * actually construct the vissprites in z order if it can be done in - * linear time. - */ - - vissprite_t *best = 0; - for(int i = 0; i < count; ++i) + /// @todo Optimize: + /// Profile results from nuts.wad show over 25% of total execution time + /// was spent sorting vissprites (nuts.wad map01 is a perfect pathological + /// test case). + /// + /// Rather than try to speed up the sort, it would make more sense to + /// actually construct the vissprites in z order if it can be done in + /// linear time. + + vissprite_t *best = nullptr; + for(dint i = 0; i < count; ++i) { coord_t bestdist = 0; for(vissprite_t *ds = unsorted.next; ds != &unsorted; ds = ds->next)