forked from 0ad/0ad
wraitii
e2f4379e9a
Potential marginal optimizations to the water data creation code. This was SVN commit r14784.
172 lines
4.3 KiB
C++
172 lines
4.3 KiB
C++
/* Copyright (C) 2012 Wildfire Games.
|
|
* This file is part of 0 A.D.
|
|
*
|
|
* 0 A.D. is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* 0 A.D. is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Water settings (speed, height) and texture management
|
|
*/
|
|
|
|
#ifndef INCLUDED_WATERMANAGER
|
|
#define INCLUDED_WATERMANAGER
|
|
|
|
#include "graphics/Texture.h"
|
|
#include "lib/ogl.h"
|
|
#include "maths/Matrix3D.h"
|
|
#include "ps/Overlay.h"
|
|
#include "renderer/VertexBufferManager.h"
|
|
|
|
class CSimulation2;
|
|
|
|
struct SWavesVertex {
|
|
// vertex position
|
|
CVector3D m_Position;
|
|
u8 m_UV[2];
|
|
};
|
|
cassert(sizeof(SWavesVertex) == 16);
|
|
|
|
|
|
|
|
/**
|
|
* Class WaterManager: Maintain water settings and textures.
|
|
*
|
|
* This could be extended to provide more advanced water rendering effects
|
|
* (refractive/reflective water) in the future.
|
|
*/
|
|
|
|
class WaterManager
|
|
{
|
|
public:
|
|
CTexturePtr m_WaterTexture[60];
|
|
CTexturePtr m_NormalMap[60];
|
|
CTexturePtr m_Foam;
|
|
CTexturePtr m_Wave;
|
|
float* m_WaveX;
|
|
float* m_WaveZ;
|
|
float* m_DistanceToShore;
|
|
float* m_FoamFactor;
|
|
|
|
size_t m_MapSize;
|
|
ssize_t m_TexSize;
|
|
|
|
GLuint m_depthTT;
|
|
GLuint m_waveTT;
|
|
|
|
// used to know what to update when updating parts of the terrain only.
|
|
u32 m_updatei0;
|
|
u32 m_updatej0;
|
|
u32 m_updatei1;
|
|
u32 m_updatej1;
|
|
|
|
int m_WaterCurrentTex;
|
|
CColor m_WaterColor;
|
|
bool m_RenderWater;
|
|
|
|
// Those variables register the current quality level. If there is a change, I have to recompile the shader.
|
|
bool m_WaterNormal;
|
|
bool m_WaterRealDepth;
|
|
bool m_WaterFoam;
|
|
bool m_WaterCoastalWaves;
|
|
bool m_WaterRefraction;
|
|
bool m_WaterReflection;
|
|
bool m_WaterShadows;
|
|
|
|
bool m_NeedsReloading;
|
|
// requires also recreating the super fancy information.
|
|
bool m_NeedInfoUpdate;
|
|
|
|
bool m_WaterScroll;
|
|
float m_WaterHeight;
|
|
float m_WaterMaxAlpha;
|
|
float m_WaterFullDepth;
|
|
float m_WaterAlphaOffset;
|
|
|
|
float m_SWaterSpeed;
|
|
float m_TWaterSpeed;
|
|
float m_SWaterTrans;
|
|
float m_TWaterTrans;
|
|
float m_SWaterScrollCounter;
|
|
float m_TWaterScrollCounter;
|
|
double m_WaterTexTimer;
|
|
|
|
// Reflection and refraction textures for fancy water
|
|
GLuint m_ReflectionTexture;
|
|
GLuint m_RefractionTexture;
|
|
size_t m_ReflectionTextureSize;
|
|
size_t m_RefractionTextureSize;
|
|
|
|
// Model-view-projection matrices for reflected & refracted cameras
|
|
// (used to let the vertex shader do projective texturing)
|
|
CMatrix3D m_ReflectionMatrix;
|
|
CMatrix3D m_RefractionMatrix;
|
|
|
|
// Shader parameters for fancy water
|
|
CColor m_WaterTint;
|
|
float m_RepeatPeriod;
|
|
float m_SpecularStrength;
|
|
float m_Waviness;
|
|
float m_Murkiness;
|
|
CColor m_ReflectionTint;
|
|
float m_ReflectionTintStrength;
|
|
|
|
// Waves
|
|
// see the struct above.
|
|
CVertexBuffer::VBChunk* m_VBWaves;
|
|
CVertexBuffer::VBChunk* m_VBWavesIndices;
|
|
|
|
public:
|
|
WaterManager();
|
|
~WaterManager();
|
|
|
|
/**
|
|
* LoadWaterTextures: Load water textures from within the
|
|
* progressive load framework.
|
|
*
|
|
* @return 0 if loading has completed, a value from 1 to 100 (in percent of completion)
|
|
* if more textures need to be loaded and a negative error value on failure.
|
|
*/
|
|
int LoadWaterTextures();
|
|
|
|
/**
|
|
* UnloadWaterTextures: Free any loaded water textures and reset the internal state
|
|
* so that another call to LoadWaterTextures will begin progressive loading.
|
|
*/
|
|
void UnloadWaterTextures();
|
|
|
|
/**
|
|
* CreateSuperfancyInfo: creates textures and wave vertices for superfancy water
|
|
*/
|
|
void CreateSuperfancyInfo(CSimulation2* simulation);
|
|
|
|
/**
|
|
* Updates the map size. Will trigger a complete recalculation of fancy water information the next turn.
|
|
*/
|
|
void SetMapSize(size_t size);
|
|
|
|
/**
|
|
* Updates the settings to the one from the renderer, and sets m_NeedsReloading.
|
|
*/
|
|
void UpdateQuality();
|
|
|
|
/**
|
|
* Returns true if fancy water shaders will be used (i.e. the hardware is capable
|
|
* and it hasn't been configured off)
|
|
*/
|
|
bool WillRenderFancyWater();
|
|
};
|
|
|
|
|
|
#endif // INCLUDED_WATERMANAGER
|