summaryrefslogtreecommitdiff
path: root/test/gl2/ocean_surface.h
diff options
context:
space:
mode:
authorJason Maskell <[email protected]>2016-05-09 10:39:54 +0200
committerJason Maskell <[email protected]>2016-05-09 10:39:54 +0200
commit79b3462799c28af8ba586349bd671b1b56e72353 (patch)
tree3b06e36c390254c0dc7f3733a0d32af213d87293 /test/gl2/ocean_surface.h
downloadwaveworks_archive-79b3462799c28af8ba586349bd671b1b56e72353.tar.xz
waveworks_archive-79b3462799c28af8ba586349bd671b1b56e72353.zip
Initial commit with PS4 and XBone stuff trimmed.
Diffstat (limited to 'test/gl2/ocean_surface.h')
-rw-r--r--test/gl2/ocean_surface.h346
1 files changed, 346 insertions, 0 deletions
diff --git a/test/gl2/ocean_surface.h b/test/gl2/ocean_surface.h
new file mode 100644
index 0000000..5056b68
--- /dev/null
+++ b/test/gl2/ocean_surface.h
@@ -0,0 +1,346 @@
+// Copyright (c) 2011 NVIDIA Corporation. All rights reserved.
+//
+// TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
+// *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
+// OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT,IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
+// OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT, OR
+// CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS
+// OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY
+// OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
+// EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+//
+// Please direct any bugs or questions to [email protected]
+
+#include <GFSDK_WaveWorks.h>
+#include <windows.h>
+#include <stdio.h>
+#include <GL/gl.h>
+
+// types for GL functoins not defined in WaveWorks
+typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+
+// GL constants
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_TEXTURE0 0x84C0
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_LINK_STATUS 0x8B82
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_TESS_EVALUATION_SHADER 0x8E87
+#define GL_TESS_CONTROL_SHADER 0x8E88
+#define GL_GEOMETRY_SHADER 0x8DD9
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_STATIC_DRAW 0x88E4
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+
+// DDS file reading related structures
+typedef struct
+{
+ GLsizei width;
+ GLsizei height;
+ GLint components;
+ GLenum format;
+ GLint numMipmaps;
+ GLubyte *pixels;
+} gliGenericImage;
+
+#ifndef _DDSURFACEDESC2
+ // following structs & defines are copied from ddraw.h
+
+ #ifndef DUMMYUNIONNAMEN
+ #if defined(__cplusplus) || !defined(NONAMELESSUNION)
+ #define DUMMYUNIONNAMEN(n)
+ #else
+ #define DUMMYUNIONNAMEN(n) u##n
+ #endif
+ #endif
+
+ #ifndef MAKEFOURCC
+ #define MAKEFOURCC(ch0, ch1, ch2, ch3) \
+ ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
+ ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
+ #endif //defined(MAKEFOURCC)
+
+ #define DDSD_PIXELFORMAT 0x00001000l
+ #define DDSD_CAPS 0x00000001l
+ #define DDSD_HEIGHT 0x00000002l
+ #define DDSD_WIDTH 0x00000004l
+ #define DDSD_PITCH 0x00000008l
+ #define DDSD_MIPMAPCOUNT 0x00020000l
+ #define DDPF_FOURCC 0x00000004l
+ #define DDPF_RGB 0x00000040l
+ #define FOURCC_DXT1 (MAKEFOURCC('D','X','T','1'))
+ #define FOURCC_DXT2 (MAKEFOURCC('D','X','T','2'))
+ #define FOURCC_DXT3 (MAKEFOURCC('D','X','T','3'))
+ #define FOURCC_DXT4 (MAKEFOURCC('D','X','T','4'))
+ #define FOURCC_DXT5 (MAKEFOURCC('D','X','T','5'))
+
+ typedef struct _DDCOLORKEY
+ {
+ DWORD dwColorSpaceLowValue; // low boundary of color space that is to
+ // be treated as Color Key, inclusive
+ DWORD dwColorSpaceHighValue; // high boundary of color space that is
+ // to be treated as Color Key, inclusive
+ } DDCOLORKEY;
+
+ typedef struct _DDPIXELFORMAT
+ {
+ DWORD dwSize; // size of structure
+ DWORD dwFlags; // pixel format flags
+ DWORD dwFourCC; // (FOURCC code)
+ union
+ {
+ DWORD dwRGBBitCount; // how many bits per pixel
+ DWORD dwYUVBitCount; // how many bits per pixel
+ DWORD dwZBufferBitDepth; // how many total bits/pixel in z buffer (including any stencil bits)
+ DWORD dwAlphaBitDepth; // how many bits for alpha channels
+ DWORD dwLuminanceBitCount; // how many bits per pixel
+ DWORD dwBumpBitCount; // how many bits per "buxel", total
+ DWORD dwPrivateFormatBitCount;// Bits per pixel of private driver formats. Only valid in texture
+ // format list and if DDPF_D3DFORMAT is set
+ } DUMMYUNIONNAMEN(1);
+ union
+ {
+ DWORD dwRBitMask; // mask for red bit
+ DWORD dwYBitMask; // mask for Y bits
+ DWORD dwStencilBitDepth; // how many stencil bits (note: dwZBufferBitDepth-dwStencilBitDepth is total Z-only bits)
+ DWORD dwLuminanceBitMask; // mask for luminance bits
+ DWORD dwBumpDuBitMask; // mask for bump map U delta bits
+ DWORD dwOperations; // DDPF_D3DFORMAT Operations
+ } DUMMYUNIONNAMEN(2);
+ union
+ {
+ DWORD dwGBitMask; // mask for green bits
+ DWORD dwUBitMask; // mask for U bits
+ DWORD dwZBitMask; // mask for Z bits
+ DWORD dwBumpDvBitMask; // mask for bump map V delta bits
+ struct
+ {
+ WORD wFlipMSTypes; // Multisample methods supported via flip for this D3DFORMAT
+ WORD wBltMSTypes; // Multisample methods supported via blt for this D3DFORMAT
+ } MultiSampleCaps;
+
+ } DUMMYUNIONNAMEN(3);
+ union
+ {
+ DWORD dwBBitMask; // mask for blue bits
+ DWORD dwVBitMask; // mask for V bits
+ DWORD dwStencilBitMask; // mask for stencil bits
+ DWORD dwBumpLuminanceBitMask; // mask for luminance in bump map
+ } DUMMYUNIONNAMEN(4);
+ union
+ {
+ DWORD dwRGBAlphaBitMask; // mask for alpha channel
+ DWORD dwYUVAlphaBitMask; // mask for alpha channel
+ DWORD dwLuminanceAlphaBitMask;// mask for alpha channel
+ DWORD dwRGBZBitMask; // mask for Z channel
+ DWORD dwYUVZBitMask; // mask for Z channel
+ } DUMMYUNIONNAMEN(5);
+ } DDPIXELFORMAT;
+
+ typedef struct _DDSCAPS2
+ {
+ DWORD dwCaps; // capabilities of surface wanted
+ DWORD dwCaps2;
+ DWORD dwCaps3;
+ union
+ {
+ DWORD dwCaps4;
+ DWORD dwVolumeDepth;
+ } DUMMYUNIONNAMEN(1);
+ } DDSCAPS2;
+
+ typedef struct _DDSURFACEDESC2
+ {
+ DWORD dwSize; // size of the DDSURFACEDESC structure
+ DWORD dwFlags; // determines what fields are valid
+ DWORD dwHeight; // height of surface to be created
+ DWORD dwWidth; // width of input surface
+ union
+ {
+ LONG lPitch; // distance to start of next line (return value only)
+ DWORD dwLinearSize; // Formless late-allocated optimized surface size
+ } DUMMYUNIONNAMEN(1);
+ union
+ {
+ DWORD dwBackBufferCount; // number of back buffers requested
+ DWORD dwDepth; // the depth if this is a volume texture
+ } DUMMYUNIONNAMEN(5);
+ union
+ {
+ DWORD dwMipMapCount; // number of mip-map levels requestde
+ // dwZBufferBitDepth removed, use ddpfPixelFormat one instead
+ DWORD dwRefreshRate; // refresh rate (used when display mode is described)
+ DWORD dwSrcVBHandle; // The source used in VB::Optimize
+ } DUMMYUNIONNAMEN(2);
+ DWORD dwAlphaBitDepth; // depth of alpha buffer requested
+ DWORD dwReserved; // reserved
+ DWORD lpSurface; // pointer to the associated surface memory
+ union
+ {
+ DDCOLORKEY ddckCKDestOverlay; // color key for destination overlay use
+ DWORD dwEmptyFaceColor; // Physical color for empty cubemap faces
+ } DUMMYUNIONNAMEN(3);
+ DDCOLORKEY ddckCKDestBlt; // color key for destination blt use
+ DDCOLORKEY ddckCKSrcOverlay; // color key for source overlay use
+ DDCOLORKEY ddckCKSrcBlt; // color key for source blt use
+ union
+ {
+ DDPIXELFORMAT ddpfPixelFormat; // pixel format description of the surface
+ DWORD dwFVF; // vertex format description of vertex buffers
+ } DUMMYUNIONNAMEN(4);
+ DDSCAPS2 ddsCaps; // direct draw surface capabilities
+ DWORD dwTextureStage; // stage in multitexture cascade
+ } DDSURFACEDESC2;
+#endif
+
+
+class OceanSurface
+{
+ public:
+ OceanSurface(bool use_texture_arrays);
+ ~OceanSurface();
+
+ // Quadtree handle and shader mappings
+ GFSDK_WaveWorks_QuadtreeHandle m_hOceanQuadTree;
+ UINT* m_pQuadTreeShaderInputMappings;
+ UINT* m_pSimulationShaderInputMappings;
+
+ // Quadtree initialization
+ gfsdk_waveworks_result InitQuadTree(const GFSDK_WaveWorks_Quadtree_Params& params);
+
+
+ // Initializing OpenGL functions addresses
+ HRESULT InitGLFunctions(void);
+
+ // Creating OpenGL programs
+ GLuint LoadProgram(char *);
+ GLuint CompileShader(char *text, GLenum type);
+
+ // Texture loading related methods
+ int LoadTexture(char * filename, GLuint * texID);
+ void CreateTextures(void);
+
+ // Rendering related methods
+ void SetupNormalView(void);
+ void Render(GFSDK_WaveWorks_SimulationHandle hSim, GFSDK_WaveWorks_Simulation_Settings settings);
+
+ // Constants
+ UINT ScreenWidth;
+ UINT ScreenHeight;
+ UINT MultiSampleCount;
+ UINT MultiSampleQuality;
+
+ // Programs
+ GLuint WaterProgram;
+
+ // Textures
+ GLuint FoamIntensityTextureID;
+ GLuint FoamIntensityTextureBindLocation;
+ GLuint FoamDiffuseTextureID;
+ GLuint FoamDiffuseTextureBindLocation;
+
+ // GL resources allocated for WaveWorks during ocean surface rendering
+ GFSDK_WaveWorks_Simulation_GL_Pool glPool;
+
+ // Camera reated variables
+ float CameraPosition[3];
+ float LookAtPosition[3];
+
+ float NormalViewMatrix[4][4];
+ float NormalProjMatrix[4][4];
+ float NormalViewProjMatrix[4][4];
+
+ // Counters
+ float total_time;
+ float delta_time;
+ long frame_number;
+
+ // Input
+ int MouseX,MouseY;
+ float MouseDX,MouseDY;
+ float Alpha;
+ float Beta;
+
+ // GL functions
+ PFNGLACTIVETEXTUREPROC glActiveTexture;
+ PFNGLATTACHSHADERPROC glAttachShader;
+ PFNGLBINDBUFFERPROC glBindBuffer;
+ PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
+ PFNGLBINDTEXTUREPROC glBindTexture;
+ PFNGLBUFFERDATAPROC glBufferData;
+ PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
+ PFNGLCLEARCOLORPROC glClearColor;
+ PFNGLCLEARDEPTHFPROC glClearDepthf;
+ PFNGLCLEARPROC glClear;
+ PFNGLCOLORMASKPROC glColorMask;
+ PFNGLCOMPILESHADERPROC glCompileShader;
+ PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D;
+ PFNGLCREATEPROGRAMPROC glCreateProgram;
+ PFNGLCREATESHADERPROC glCreateShader;
+ PFNGLDELETEBUFFERSPROC glDeleteBuffers;
+ PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
+ PFNGLDELETEPROGRAMPROC glDeleteProgram;
+ PFNGLDELETESHADERPROC glDeleteShader;
+ PFNGLDELETETEXTURESPROC glDeleteTextures;
+ PFNGLDISABLEPROC glDisable;
+ PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
+ PFNGLDRAWELEMENTSPROC glDrawElements;
+ PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
+ PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
+ PFNGLGENBUFFERSPROC glGenBuffers;
+ PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
+ PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
+ PFNGLGENTEXTURESPROC glGenTextures;
+ PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation;
+ PFNGLGETERRORPROC glGetError;
+ PFNGLGETINTEGERVPROC glGetIntegerv;
+ PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
+ PFNGLGETPROGRAMIVPROC glGetProgramiv;
+ PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
+ PFNGLGETSHADERIVPROC glGetShaderiv;
+ PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
+ PFNGLLINKPROGRAMPROC glLinkProgram;
+ PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
+ PFNGLPATCHPARAMETERIPROC glPatchParameteri;
+ PFNGLSHADERSOURCEPROC glShaderSource;
+ PFNGLTEXIMAGE2DPROC glTexImage2D;
+ PFNGLTEXPARAMETERFPROC glTexParameterf;
+ PFNGLTEXPARAMETERIPROC glTexParameteri;
+ PFNGLTEXSUBIMAGE2DPROC glTexSubImage2D;
+ PFNGLUNIFORM1FPROC glUniform1f;
+ PFNGLUNIFORM1IPROC glUniform1i;
+ PFNGLUNIFORM3FVPROC glUniform3fv;
+ PFNGLUNIFORM4FVPROC glUniform4fv;
+ PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv;
+ PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
+ PFNGLUNMAPBUFFERPROC glUnmapBuffer;
+ PFNGLUSEPROGRAMPROC glUseProgram;
+ PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
+ PFNGLVIEWPORTPROC glViewport;
+ PFNGLGENQUERIESPROC glGenQueries;
+ PFNGLDELETEQUERIESPROC glDeleteQueries;
+ PFNGLQUERYCOUNTERPROC glQueryCounter;
+ PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v;
+ PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib;
+ PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
+ PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
+ PFNGLREADBUFFERPROC glReadBuffer;
+ PFNGLDRAWBUFFERSPROC glDrawBuffers;
+ PFNGLTEXIMAGE3DPROC glTexImage3D;
+};
+
+void checkError(const char *);
+