[1481] | 1 | #pragma once
|
---|
| 2 | #include <vector>
|
---|
| 3 | #include "Parameters.h"
|
---|
| 4 | #include "Vector.hpp"
|
---|
| 5 | #include "half.h"
|
---|
| 6 |
|
---|
| 7 | #define RAY_TABLE_WIDTH 512
|
---|
| 8 | #define RAY_TABLE_HEIGHT 512
|
---|
| 9 |
|
---|
| 10 | #define RAY_ORIGIN_COLOR_FORMAT D3DFMT_A16B16G16R16F
|
---|
| 11 | #define RAY_DIR_COLOR_FORMAT D3DFMT_A16B16G16R16F
|
---|
| 12 | #define DEPTH_FORMAT D3DFMT_D24S8
|
---|
| 13 |
|
---|
| 14 |
|
---|
| 15 | class HREEffect
|
---|
| 16 | {
|
---|
| 17 | //! pointer to global user-adjustable application parameters object
|
---|
| 18 | static Parameters* parameters;
|
---|
| 19 |
|
---|
| 20 | //! pointer to main DX device
|
---|
| 21 | LPDIRECT3DDEVICE9 device;
|
---|
| 22 | //! pointer to main DX effect
|
---|
| 23 | LPD3DXEFFECT effect;
|
---|
| 24 |
|
---|
| 25 | //! frame color buffer surface
|
---|
| 26 | //! saved before render-to-texture, and restored as the render target for the final rendering to the screen
|
---|
| 27 | LPDIRECT3DSURFACE9 frameColorBuffer;
|
---|
| 28 | //! frame depth buffer surface
|
---|
| 29 | //! saved before render-to-texture, and restored as the render target for the final rendering to the screen
|
---|
| 30 | LPDIRECT3DSURFACE9 frameDepthStencilBuffer;
|
---|
| 31 |
|
---|
| 32 | LPDIRECT3DTEXTURE9 rayOriginTableTexture;
|
---|
| 33 | LPDIRECT3DSURFACE9 rayOriginTableSurface;
|
---|
| 34 |
|
---|
| 35 | LPDIRECT3DTEXTURE9 rayDirTableTexture;
|
---|
| 36 | LPDIRECT3DSURFACE9 rayDirTableSurface;
|
---|
| 37 |
|
---|
| 38 | LPDIRECT3DTEXTURE9 rayOriginTableTexture2;
|
---|
| 39 | LPDIRECT3DSURFACE9 rayOriginTableSurface2;
|
---|
| 40 |
|
---|
| 41 | LPDIRECT3DTEXTURE9 rayDirTableTexture2;
|
---|
| 42 | LPDIRECT3DSURFACE9 rayDirTableSurface2;
|
---|
| 43 |
|
---|
| 44 | LPDIRECT3DTEXTURE9 conePeakTexture;
|
---|
| 45 | LPDIRECT3DSURFACE9 conePeakSurface;
|
---|
| 46 | LPDIRECT3DTEXTURE9 coneDirTexture;
|
---|
| 47 | LPDIRECT3DSURFACE9 coneDirSurface;
|
---|
| 48 |
|
---|
| 49 | LPDIRECT3DTEXTURE9 conePeakTextureMem;
|
---|
| 50 | LPDIRECT3DSURFACE9 conePeakSurfaceMem;
|
---|
| 51 | LPDIRECT3DTEXTURE9 coneDirTextureMem;
|
---|
| 52 | LPDIRECT3DSURFACE9 coneDirSurfaceMem;
|
---|
| 53 |
|
---|
| 54 | LPDIRECT3DCUBETEXTURE9 environmentCubeTexture;
|
---|
| 55 |
|
---|
| 56 | LPDIRECT3DSURFACE9 depthSurface;
|
---|
| 57 | LPDIRECT3DSURFACE9 coneStencil;
|
---|
| 58 |
|
---|
| 59 | LPDIRECT3DVERTEXDECLARATION9 trianglePrimitiveDeclaration;
|
---|
| 60 |
|
---|
| 61 | //! camera
|
---|
| 62 | CFirstPersonCamera* camera;
|
---|
| 63 | //! primary light source (can be moved just like the real camera, and can be used as the camera)
|
---|
| 64 | CFirstPersonCamera* lightCamera;
|
---|
| 65 |
|
---|
| 66 | //! struct containing all mesh related data. Will be filled from X files in HREEffect constructor
|
---|
| 67 | class Mesh
|
---|
| 68 | {
|
---|
| 69 | public:
|
---|
| 70 | HREEffect* owner;
|
---|
| 71 | unsigned int nSubsets; //!< number of submeshes (with possible different material)
|
---|
| 72 | LPD3DXMESH mesh; //!< D3D mesh
|
---|
| 73 | LPD3DXBUFFER materialBuffer; //!< D3D material buffer
|
---|
| 74 | D3DXMATERIAL* materials; //!< D3D material array
|
---|
| 75 | LPDIRECT3DTEXTURE9* textures; //!< D3D textures for the materials
|
---|
| 76 | LPDIRECT3DVERTEXBUFFER9 primitiveVertexBuffer; //!< ray engine representation of the mesh (list of points with a triangle encoded in each)
|
---|
| 77 |
|
---|
| 78 | HRESULT setVertexFormat(DWORD fvf, LPDIRECT3DDEVICE9 device); //!< rebuild D3D to have differnet vertex format
|
---|
| 79 |
|
---|
| 80 | };
|
---|
| 81 | //! private method that loads a mesh and its textures
|
---|
| 82 | void loadMesh(LPCWSTR fileName);
|
---|
| 83 |
|
---|
| 84 | //! private method to load a texture
|
---|
| 85 | LPDIRECT3DTEXTURE9 loadTexture(LPCWSTR fileName);
|
---|
| 86 |
|
---|
| 87 | //! release material texture resources
|
---|
| 88 | void releaseTextures();
|
---|
| 89 | //! release mesh resources
|
---|
| 90 | void releaseMeshes();
|
---|
| 91 | //! release entities
|
---|
| 92 | void releaseEntities();
|
---|
| 93 |
|
---|
| 94 | //! struct that represents a virtual world object: a mesh and a model-world transformation matrix
|
---|
| 95 | friend struct Entity;
|
---|
| 96 | struct Entity
|
---|
| 97 | {
|
---|
| 98 | HREEffect* owner; //!< enclosing class instance
|
---|
| 99 |
|
---|
| 100 | Mesh* mesh; //!< mesh
|
---|
| 101 | D3DXMATRIX modelWorldTransform; //!< modeling transform
|
---|
| 102 | D3DXMATRIX inverseTransposedModelWorldTransform; //!< IT modeling transform for surface normal transformation
|
---|
| 103 | };
|
---|
| 104 |
|
---|
| 105 | //! vector of loaded meshes
|
---|
| 106 | std::vector<Mesh*> meshes;
|
---|
| 107 | //! vector of loaded textures (textures specified in mesh's material will be loaded here)
|
---|
| 108 | std::vector<LPDIRECT3DTEXTURE9> materialTextures;
|
---|
| 109 | //! vector of virtual world objects
|
---|
| 110 | std::vector<Entity> entities;
|
---|
| 111 |
|
---|
| 112 | //! for materials with no texture we will render with this texture
|
---|
| 113 | LPDIRECT3DTEXTURE9 emptyTexture;
|
---|
| 114 |
|
---|
| 115 | //! render a full-screen quad
|
---|
| 116 | static void drawFullScreenQuad(LPDIRECT3DDEVICE9 device, float depth = 0.0f, float fLeftU=0.0f, float fTopV=0.0f, float fRightU=1.0f, float fBottomV=1.0f);
|
---|
| 117 |
|
---|
| 118 | //! clever enum for supported final rendering methods
|
---|
| 119 | class Method{
|
---|
| 120 | unsigned int mid;
|
---|
| 121 | Method(unsigned int mid) {this->mid = mid;}
|
---|
| 122 | static const wchar_t * methodNames[10];
|
---|
| 123 | public:
|
---|
| 124 | Method(const Method& o) {mid = o.mid;}
|
---|
| 125 | const Method& operator=(const Method& o) {mid = o.mid; return *this;}
|
---|
| 126 | bool operator==(const Method& o) const {return mid == o.mid;}
|
---|
| 127 | bool operator!=(const Method& o) const {return mid != o.mid;}
|
---|
| 128 | const static Method RAYENGINE;
|
---|
| 129 | const static Method LAST;
|
---|
| 130 | const Method& next() {mid = (mid + 1)%LAST.mid; return *this;}
|
---|
| 131 | const Method& prev() {mid = (mid + LAST.mid - 1)%LAST.mid; return *this;}
|
---|
| 132 | const wchar_t* getName() {return methodNames[mid];}
|
---|
| 133 | }method;
|
---|
| 134 | public:
|
---|
| 135 | void nextMethod() {method.next();}
|
---|
| 136 | void prevMethod() {method.prev();}
|
---|
| 137 | const wchar_t* getCurrentMethodName() {return method.getName();}
|
---|
| 138 |
|
---|
| 139 | //! constructor: allocates all resources
|
---|
| 140 | HREEffect(LPDIRECT3DDEVICE9 device);
|
---|
| 141 | //! destructor: releases all resources
|
---|
| 142 | ~HREEffect(void);
|
---|
| 143 |
|
---|
| 144 | //! renders the scene using the currently selected method
|
---|
| 145 | void render();
|
---|
| 146 |
|
---|
| 147 | //! moves the virtual world objects (camera, light)
|
---|
| 148 | void move(float fElapsedTime);
|
---|
| 149 |
|
---|
| 150 | LRESULT handleMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
---|
| 151 |
|
---|
| 152 | //! adds controls for the user-adjustable application parameters
|
---|
| 153 | static void addUiParameters(Parameters* parameters);
|
---|
| 154 |
|
---|
| 155 | LPDIRECT3DDEVICE9 getDevice() {return device;}
|
---|
| 156 | };
|
---|