1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336
|
// Geometric Tools, LLC
// Copyright (c) 1998-2014
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
//
// File Version: 5.1.0 (2010/04/14)
#ifndef CASTLE_H
#define CASTLE_H
#include "Wm5WindowApplication3.h"
#include "DLitMatTexEffect.h"
using namespace Wm5;
class Castle : public WindowApplication3
{
WM5_DECLARE_INITIALIZE;
WM5_DECLARE_TERMINATE;
public:
Castle ();
virtual ~Castle ();
virtual bool OnInitialize ();
virtual void OnTerminate ();
virtual void OnIdle ();
virtual bool OnKeyDown (unsigned char key, int x, int y);
virtual bool OnMouseClick (int button, int state, int x, int y,
unsigned int modifiers);
private:
void CreateScene ();
void CreateLights ();
void CreateEffects ();
void CreateTextures ();
void CreateSharedMeshes ();
Float4 mTextColor;
NodePtr mScene, mTrnNode;
WireStatePtr mWireState;
Culler mCuller;
// The scene has a directional light.
NodePtr mDLightRoot;
LightPtr mDLight;
// Two basic effects are used, one for opaque geometry and one for
// water (semitransparent geometry).
DLitMatTexEffect* mDLitMatTexEffect;
DLitMatTexEffect* mDLitMatTexAlphaEffect;
Texture2DEffect* mTexEffect;
MaterialEffect* mMatEffect;
// Materials in the scene.
MaterialPtr mOutWallMaterial;
MaterialPtr mStoneMaterial;
MaterialPtr mRiverMaterial;
MaterialPtr mWallMaterial;
MaterialPtr mStairsMaterial;
MaterialPtr mInteriorMaterial;
MaterialPtr mDoorMaterial;
MaterialPtr mFloorMaterial;
MaterialPtr mWoodCeilingMaterial;
MaterialPtr mKeystoneMaterial;
MaterialPtr mDrawBridgeMaterial;
MaterialPtr mRoofMaterial;
MaterialPtr mRampMaterial;
MaterialPtr mWoodShieldMaterial;
MaterialPtr mTorchHolderMaterial;
MaterialPtr mTorchWoodMaterial;
MaterialPtr mTorchHeadMaterial;
MaterialPtr mBarrelBaseMaterial;
MaterialPtr mBarrelMaterial;
MaterialPtr mDoorFrameMaterial;
MaterialPtr mBunkMaterial;
MaterialPtr mBlanketMaterial;
MaterialPtr mBenchMaterial;
MaterialPtr mTableMaterial;
MaterialPtr mBarrelRackMaterial;
MaterialPtr mChestMaterial;
MaterialPtr mLightwoodMaterial;
MaterialPtr mMaterial26;
MaterialPtr mRopeMaterial;
MaterialPtr mSquareTableMaterial;
MaterialPtr mSimpleChairMaterial;
MaterialPtr mMugMaterial;
MaterialPtr mPortMaterial;
MaterialPtr mSkyMaterial;
MaterialPtr mWaterMaterial;
MaterialPtr mGravel1Material;
MaterialPtr mGravel2Material;
MaterialPtr mGravelCornerNEMaterial;
MaterialPtr mGravelCornerNWMaterial;
MaterialPtr mGravelCornerSEMaterial;
MaterialPtr mGravelCornerSWMaterial;
MaterialPtr mGravelCapNEMaterial;
MaterialPtr mGravelCapNWMaterial;
MaterialPtr mGravelSideNMaterial;
MaterialPtr mGravelSideSMaterial;
MaterialPtr mGravelSideWMaterial;
MaterialPtr mStone1Material;
MaterialPtr mStone2Material;
MaterialPtr mStone3Material;
MaterialPtr mLargeStone1Material;
MaterialPtr mLargerStone1Material;
MaterialPtr mLargerStone2Material;
MaterialPtr mLargestStone1Material;
MaterialPtr mLargestStone2Material;
MaterialPtr mHugeStone1Material;
MaterialPtr mHugeStone2Material;
// Textures in the scene.
Texture2DPtr mOutWall;
Texture2DPtr mStone;
Texture2DPtr mRiver;
Texture2DPtr mWall;
Texture2DPtr mWallLightMap;
Texture2DPtr mSteps;
Texture2DPtr mDoor;
Texture2DPtr mFloor;
Texture2DPtr mWoodCeiling;
Texture2DPtr mKeystone;
Texture2DPtr mTilePlanks;
Texture2DPtr mRoof;
Texture2DPtr mRamp;
Texture2DPtr mShield;
Texture2DPtr mMetal;
Texture2DPtr mTorchWood;
Texture2DPtr mTorchHead;
Texture2DPtr mBarrelBase;
Texture2DPtr mBarrel;
Texture2DPtr mDoorFrame;
Texture2DPtr mBunkwood;
Texture2DPtr mBlanket;
Texture2DPtr mBench;
Texture2DPtr mTable;
Texture2DPtr mBarrelRack;
Texture2DPtr mChest;
Texture2DPtr mLightwood;
Texture2DPtr mRope;
Texture2DPtr mSquareTable;
Texture2DPtr mSimpleChair;
Texture2DPtr mMug;
Texture2DPtr mPort;
Texture2DPtr mSky;
Texture2DPtr mWater;
Texture2DPtr mGravel1;
Texture2DPtr mGravel2;
Texture2DPtr mGravelCornerNE;
Texture2DPtr mGravelCornerNW;
Texture2DPtr mGravelCornerSE;
Texture2DPtr mGravelCornerSW;
Texture2DPtr mGravelCapNE;
Texture2DPtr mGravelCapNW;
Texture2DPtr mGravelSideN;
Texture2DPtr mGravelSideS;
Texture2DPtr mGravelSideW;
Texture2DPtr mStone1;
Texture2DPtr mStone2;
Texture2DPtr mStone3;
Texture2DPtr mLargeStone1;
Texture2DPtr mLargerStone1;
Texture2DPtr mLargerStone2;
Texture2DPtr mLargestStone1;
Texture2DPtr mLargestStone2;
Texture2DPtr mHugeStone1;
Texture2DPtr mHugeStone2;
// Shared meshes.
TriMeshPtr mWoodShieldMesh;
TriMeshPtr mTorchMetalMesh;
TriMeshPtr mTorchWoodMesh;
TriMeshPtr mTorchHeadMesh;
TriMeshPtr mVerticalSpoutMesh;
TriMeshPtr mHorizontalSpoutMesh;
TriMeshPtr mBarrelHolderMesh;
TriMeshPtr mBarrelMesh;
TriMeshPtr mDoorFrame01Mesh;
TriMeshPtr mDoorFrame53Mesh;
TriMeshPtr mDoorFrame61Mesh;
TriMeshPtr mDoorFrame62Mesh;
// Picking support to allow collision avoidance and to display mesh
// information.
bool AllowMotion (float sign);
char mPickMessage[1024];
Picker mPicker;
int mNumRays;
float mHalfAngle;
float* mCos;
float* mSin;
float* mTolerance;
// Arrange for the camera to be a fixed distance above the nearest object.
void AdjustVerticalDistance ();
virtual void MoveForward ();
virtual void MoveBackward ();
float mVerticalDistance;
private:
// Support for loading data sets.
class VertexPNT1
{
public:
VertexPNT1 ();
bool operator< (const VertexPNT1& vertex) const;
int PIndex, NIndex, TIndex;
};
class VertexPNT2
{
public:
VertexPNT2 ();
bool operator< (const VertexPNT2& vertex) const;
int PIndex, NIndex, T0Index, T1Index;
};
TriMesh* LoadMeshPNT1 (const std::string& name);
TriMesh* LoadMeshPNT2 (const std::string& name);
std::vector<TriMesh*> LoadMeshPNT1Multi (const std::string& name);
void GetFloat3 (std::ifstream& inFile, int& numElements,
Float3*& elements);
void GetFloat2 (std::ifstream& inFile, int& numElements,
Float2*& elements);
private:
// The list of exported objects.
void CreateWallTurret02 ();
void CreateWallTurret01 ();
void CreateWall02 ();
void CreateWall01 ();
void CreateQuadPatch01 ();
void CreateWater ();
void CreateWater2 ();
void CreateMainGate01 ();
void CreateMainGate ();
void CreateFrontHall ();
void CreateFrontRamp ();
void CreateExterior ();
void CreateDrawBridge ();
void CreateCylinder02 ();
void CreateBridge ();
void CreateLargePort ();
void CreateSmallPort (int i);
void CreateRope (int i);
void CreateSkyDome ();
void CreateTerrain ();
enum { MAX_WOODSHIELDS = 8 }; // 0 unused
static APoint msWoodShieldTrn[MAX_WOODSHIELDS];
static float msWoodShieldYRotate[MAX_WOODSHIELDS];
static float msWoodShieldXRotate[MAX_WOODSHIELDS];
void CreateWoodShield (int i);
enum { MAX_TORCHES = 18 }; // 0 unused
static APoint msTorchTrn[MAX_TORCHES];
static float msTorchZAngle[MAX_TORCHES];
void CreateTorch (int i);
enum { MAX_KEGS = 4 }; // 0 unused
static APoint msKegTrn[MAX_KEGS];
static float msKegZAngle[MAX_KEGS];
void CreateKeg (int i);
enum { MAX_BARRELS = 38 }; // 0 and 1 not used
static APoint msBarrelTrn[MAX_BARRELS];
static float msBarrelZAngle[MAX_BARRELS];
static float msBarrelYAngle[MAX_BARRELS];
static float msBarrelXAngle[MAX_BARRELS];
void CreateBarrel (int i);
enum { MAX_DOORFRAMES = 84 }; // 0 unused
static APoint msDoorFrameTrn[MAX_DOORFRAMES];
static float msDoorFrameZAngle[MAX_DOORFRAMES];
static APoint msDoorFramePivotTrn[35]; // index i-49
std::string GetDoorFrameFilename (int i);
void CreateDoorFrame (int i); // 1 <= i <= 48, i = 61, 64 <= i <= 68, 79
void CreateDoorFramePivotTrn (int i); // 49 <= i <= 60, 69 <= i <= 78, 82, 83
void CreateDoorFrameScalePivotTrn (int i); // 62, 63, 80, 81
enum { MAX_BUNKS = 21 }; // 0, 2, 3 unused
static APoint msBunkTrn[MAX_BUNKS];
static float msBunkZAngle[MAX_BUNKS];
void CreateBunk (int i);
enum { MAX_BENCHES = 37 }; // 0 unused
static APoint msBenchTrn[MAX_BENCHES];
static float msBenchZAngle[MAX_BENCHES];
void CreateBench (int i);
enum { MAX_TABLES = 10 }; // 0 unused
static APoint msTableTrn[MAX_TABLES];
static float msTableZAngle[MAX_TABLES];
void CreateTable (int i);
enum { MAX_BARREL_RACKS = 5 }; // 0 unused
static APoint msBarrelRackTrn[MAX_BARREL_RACKS];
void CreateBarrelRack (int i);
enum { MAX_CHESTS = 37 }; // 0 unused
static APoint msChestTrn[MAX_CHESTS];
static float msChestZAngle[MAX_CHESTS];
void CreateChest (int i);
enum { MAX_CEILING_LIGHTS = 4 }; // 0 unused
static APoint msCeilingLightTrn[MAX_CEILING_LIGHTS];
void CreateCeilingLight (int i);
enum { MAX_SQUARE_TABLES = 8 }; // 0 unused
static APoint msSquareTableTrn[MAX_SQUARE_TABLES];
static float msSquareTableZAngle[MAX_SQUARE_TABLES];
void CreateSquareTable (int i);
enum { MAX_SIMPLE_CHAIRS = 28 }; // 0 unused
static APoint msSimpleChairTrn[MAX_SIMPLE_CHAIRS];
static float msSimpleChairZAngle[MAX_SIMPLE_CHAIRS];
void CreateSimpleChair (int i);
enum { MAX_MUGS = 43 }; // 0 unused
static APoint msMugTrn[MAX_MUGS];
static float msMugZAngle[MAX_MUGS];
void CreateMug (int i);
enum { MAX_DOORS = 10 }; // 0 unused
static APoint msDoorTrn[MAX_DOORS];
static float msDoorZAngle[MAX_DOORS];
void CreateDoor (int i);
};
WM5_REGISTER_INITIALIZE(Castle);
WM5_REGISTER_TERMINATE(Castle);
#endif
|