2025-02-17 23:17:30 -06:00

275 lines
6.7 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#ifndef _SKY_H_
#define _SKY_H_
#ifndef _MMATH_H_
#include "math/mMath.h"
#endif
#ifndef _GTEXMANAGER_H_
#include "dgl/gTexManager.h"
#endif
#ifndef _SCENEOBJECT_H_
#include "sim/sceneObject.h"
#endif
#ifndef _SCENESTATE_H_
#include "sceneGraph/sceneState.h"
#endif
#ifndef _SCENEGRAPH_H_
#include "sceneGraph/sceneGraph.h"
#endif
#ifndef _MPOINT_H_
#include "math/mPoint.h"
#endif
#ifndef _MATERIALLIST_H_
#include "dgl/materialList.h"
#endif
#ifndef _GAMEBASE_H_
#include "game/gameBase.h"
#endif
#define MAX_NUM_LAYERS 3
#define MAX_BAN_POINTS 20
class SceneGraph;
class SceneState;
class SceneRenderImage;
enum SkyState
{
isDone = 0,
comingIn = 1,
goingOut = 2
};
typedef struct
{
bool StormOn;
bool FadeIn;
bool FadeOut;
S32 currentCloud;
F32 stormSpeed;
F32 stormDir;
S32 numCloudLayers;
F32 fadeSpeed;
SkyState stormState;
}StormInfo;
typedef struct
{
SkyState state;
F32 speed;
F32 time;
F32 fadeSpeed;
}StormCloudData;
typedef struct
{
bool active;
SkyState state;
F32 speed;
F32 endPercentage;
F32 lastPercentage;
}StormFogVolume;
typedef struct
{
SkyState state;
U32 startTime;
F32 endPercentage;
F32 time;
S32 current;
U32 lastTime;
StormFogVolume volume[MaxFogVolumes];
}StormFogData;
//---------------------------------------------------------------------------
class Cloud
{
private:
Point3F mPoints[25];
Point2F mSpeed;
F32 mCenterHeight, mInnerHeight, mEdgeHeight;
F32 mAlpha[25];
S32 mDown, mOver;
static F32 mRadius;
F32 mLastTime, mOffset;
Point2F mBaseOffset, mTexCoords[25], mTextureScale;
TextureHandle mCloudHandle;
Point2F alphaCenter;
Point2F stormUpdate;
F32 stormAlpha[25];
F32 mAlphaSave[25];
static StormInfo mGStormData;
public:
Cloud();
~Cloud();
void setPoints();
void setHeights(F32 cHeight, F32 iHeight, F32 eHeight);
void setTexture(TextureHandle);
void setSpeed(Point2F);
void setTextPer(F32 cloudTextPer);
void updateCoord();
void calcAlpha();
void render(U32, U32, bool, S32, PlaneF*);
void updateStorm();
void calcStorm(F32 speed, F32 fadeSpeed);
void calcStormAlpha();
static void startStorm(SkyState);
static void setRadius(F32 rad) {mRadius = rad;}
void setRenderPoints(Point3F* renderPoints, Point2F* renderTexPoints, F32* renderAlpha, F32* renderSAlpha, S32 index);
void clipToPlane(Point3F* points, Point2F* texPoints, F32* alphaPoints, F32* sAlphaPoints, U32& rNumPoints, const PlaneF& rPlane);
};
//--------------------------------------------------------------------------
class Sky : public SceneObject
{
typedef SceneObject Parent;
private:
StormCloudData mStormCloudData;
StormFogData mStormFogData;
TextureHandle mSkyHandle[6];
StringTableEntry mCloudText[MAX_NUM_LAYERS];
F32 mCloudHeight[MAX_NUM_LAYERS];
F32 mCloudSpeed[MAX_NUM_LAYERS];
Cloud mCloudLayer[MAX_NUM_LAYERS];
F32 mRadius;
Point3F mPoints[10];
Point2F mTexCoord[4];
StringTableEntry mMaterialListName;
Point3F mSkyBoxPt;
Point3F mTopCenterPt;
Point3F mSpherePt;
ColorI mRealFogColor;
ColorI mRealSkyColor;
MaterialList mMaterialList;
ColorF mFogColor;
bool mSkyTexturesOn;
bool mRenderBoxBottom;
ColorF mSolidFillColor;
F32 mFogDistance;
F32 mVisibleDistance;
U32 mNumFogVolumes;
FogVolume mFogVolumes[MaxFogVolumes];
F32 mFogLine;
F32 mFogTime;
F32 mFogPercentage;
S32 mFogVolume;
S32 mRealFog;
F32 mRealFogMax;
F32 mRealFogMin;
F32 mRealFogSpeed;
bool mNoRenderBans;
bool mLastForce16Bit;
bool mLastForcePaletted;
SkyState mFogState;
S32 mNumCloudLayers;
Point3F mWindVelocity;
F32 mLastVisDisMod;
static bool smCloudsOn;
static bool smCloudOutlineOn;
static bool smSkyOn;
static S32 smNumCloudsOn;
bool mStormCloudsOn;
bool mStormFogOn;
bool mSetFog;
void calcPoints();
protected:
bool onAdd();
void onRemove();
bool prepRenderImage ( SceneState *state, const U32 stateKey, const U32 startZone, const bool modifyBaseZoneState=false);
void renderObject ( SceneState *state, SceneRenderImage *image);
void render(SceneState *state);
void calcAlphas_Heights(F32 zCamPos, F32 *banHeights, F32 *alphaBan, F32 DepthInFog);
void renderSkyBox(F32 lowerBanHeight, F32 alphaIn);
void calcBans(F32 *banHeights, Point3F banPoints[][MAX_BAN_POINTS], Point3F *cornerPoints);
void renderBans(F32 *alphaBan, F32 *banHeights, Point3F banPoints[][MAX_BAN_POINTS], Point3F *cornerPoints);
void inspectPostApply();
void startStorm();
void setVisibility();
void initSkyData();
bool loadDml();
void updateFog();
void updateRealFog();
void startStormFog();
void setRenderPoints(Point3F* renderPoints, S32 index);
void calcTexCoords(Point2F* texCoords, Point3F* renderPoints, S32 index);
public:
bool mEffectPrecip;
Point2F mWindDir;
enum NetMaskBits {
InitMask = BIT(0),
VisibilityMask = BIT(1),
StormCloudMask = BIT(2),
StormFogMask = BIT(3),
StormRealFogMask = BIT(4),
WindMask = BIT(5),
StormCloudsOnMask = BIT(6),
StormFogOnMask = BIT(7)
};
enum Constants {
EnvMapMaterialOffset = 6,
CloudMaterialOffset = 7
};
Sky();
~Sky();
F32 getVisibleDistance() const { return mVisibleDistance; }
/// @name Storm management.
/// @{
void stormCloudsShow(bool);
void stormFogShow(bool);
void stormCloudsOn(S32 state, F32 time);
void stormFogOn(F32 percentage, F32 time);
void stormRealFog(S32 value, F32 max, F32 min, F32 speed);
/// @}
/// @name Wind velocity
/// @{
void setWindVelocity(const Point3F &);
Point3F getWindVelocity();
/// @}
/// @name Environment mapping
/// @{
TextureHandle getEnvironmentMap() { return mMaterialList.getMaterial(EnvMapMaterialOffset); }
/// @}
/// Torque infrastructure
DECLARE_CONOBJECT(Sky);
static void initPersistFields();
static void consoleInit();
bool processArguments(S32 argc, const char **argv);
U32 packUpdate (NetConnection *conn, U32 mask, BitStream *stream);
void unpackUpdate(NetConnection *conn, BitStream *stream);
void updateVisibility();
};
#endif