# HG changeset patch # User koryspansel # Date 1315618578 25200 # Node ID e494c4295dba1a618f95d4111193345816d1ea49 # Parent 968341ab1fb25422ad3e3bd7a5eb8ad886c3e047 Conversion to World architecture diff -r 968341ab1fb2 -r e494c4295dba LightClone/LightClone.vcproj --- a/LightClone/LightClone.vcproj Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/LightClone.vcproj Fri Sep 09 18:36:18 2011 -0700 @@ -185,6 +185,10 @@ > + + @@ -283,6 +287,10 @@ > + + diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/Bot.cpp --- a/LightClone/Source/Bot.cpp Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/Bot.cpp Fri Sep 09 18:36:18 2011 -0700 @@ -4,8 +4,7 @@ #include "Bot.h" #include "Clock.h" -#include -#include +#include "VertexTypes.h" /* * DirectionAngle @@ -30,12 +29,62 @@ pEnvironment = 0; nState = BotState_Idle; kSize = D3DXVECTOR3(0.55f, 1.00f, 0.55f); + + pEffect = NULL; + pVertexBuffer = NULL; + pTexture = NULL; } /* * Initialize */ -void Bot::Initialize(Environment* pInstance) +ErrorCode Bot::Initialize(ResourceManager* pResourceManager) +{ + ErrorCode eCode = pResourceManager->CreateEffectFromFile("Data\\Shaders\\Environment.fx", &pEffect); + if(eCode == Error_Success) + { + //eCode = pResourceManager->CreateTextureFromFile("Data\\Textures\\Block02.tga", &pTexture); + if(eCode == Error_Success) + { + eCode = pResourceManager->CreateVertexBuffer(VerticesPerBlock * sizeof(Vertex::Block), D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED, &pVertexBuffer); + if(eCode == Error_Success) + { + eCode = SetupVertexBuffer(); + } + } + } + + return eCode; +} + +/* + * Terminate + */ +void Bot::Terminate() +{ + if(pVertexBuffer) + { + pVertexBuffer->Release(); + pVertexBuffer = NULL; + } + + if(pTexture) + { + pTexture->Release(); + pTexture = NULL; + } + + if(pEffect) + { + pEffect->Release(); + pEffect = NULL; + } +} + +/* + * Setup + */ +void Bot::Setup(Environment* pInstance) { pEnvironment = pInstance; nState = BotState_Idle; @@ -159,44 +208,6 @@ } /* - * Compile - */ -ErrorCode Bot::Compile(Code* pInstance, uint8* pData, uint32 nSize) -{ - const uint32 nLength = pInstance->GetLength(); - - for(uint32 i = 0; i < nLength; ++i) - { - const uint32 nAction = pInstance->GetSlot(i); - - if(Action_Forward <= nAction && nAction <= Action_Light) - { - if(nSize < 2) - return Error_Fail; - - *pData++ = Instruction_Action; - *pData++ = nAction; - - nSize -= 2; - } - else - - if(Action_FunctionA <= nAction && nAction <= Action_FunctionB) - { - if(nSize < 2) - return Error_Fail; - - *pData++ = Instruction_Call; - *pData++ = nAction - Action_FunctionA + 1; - - nSize -= 2; - } - } - - return Error_Success; -} - -/* * Update */ bool Bot::Update(float fElapsed) @@ -343,3 +354,155 @@ return false; } + +/* + * Render + */ +void Bot::Render(RenderContext& kContext, Camera& kCamera) +{ + const D3DXVECTOR3& kPosition = GetWorldPosition(); + const D3DXVECTOR3& kOrientation = GetWorldOrientation(); + + const float fOffsetX = -0.5f * (pEnvironment->GetWidth() * pEnvironment->GetScale().x); + const float fOffsetZ = -0.5f * (pEnvironment->GetHeight() * pEnvironment->GetScale().z); + + uint32 nPasses = 0; + + kContext.Apply(kCamera, pEffect); + + pEffect->SetTechnique(pEffect->GetTechnique(0)); + pEffect->Begin(&nPasses, 0); + pEffect->BeginPass(0); + + D3DXMATRIX kScale; + D3DXMatrixScaling(&kScale, kSize.x, kSize.y, kSize.z); + + D3DXMATRIX kTranslate; + D3DXMatrixTranslation(&kTranslate, fOffsetX + kPosition.x, kPosition.y, fOffsetZ + kPosition.z); + + D3DXMATRIX kRotate; + D3DXMatrixRotationY(&kRotate, kOrientation.y); + + D3DXMATRIX kTempMatrix; + D3DXMATRIX kWorldMatrix; + D3DXMatrixMultiply(&kWorldMatrix, D3DXMatrixMultiply(&kTempMatrix, &kScale, &kRotate), &kTranslate); + + const float fAlpha = ((nColor >> 24) & 0xFF) / 255.0f; + const float fRed = ((nColor >> 16) & 0xFF) / 255.0f; + const float fGreen = ((nColor >> 8 ) & 0xFF) / 255.0f; + const float fBlue = ((nColor >> 0 ) & 0xFF) / 255.0f; + + const D3DXVECTOR4 kColorVector(fRed, fGreen, fBlue, fAlpha); + + pEffect->SetMatrix(pEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); + pEffect->SetVector(pEffect->GetParameterByName(NULL, "kColor"), &kColorVector); + pEffect->SetTexture(pEffect->GetParameterByName(NULL, "kTexture"), pTexture); + pEffect->CommitChanges(); + + kContext.DrawTriangles(Vertex::Block::Declaration, pVertexBuffer, sizeof(Vertex::Block), FacesPerCube * TrianglesPerFace); + + pEffect->EndPass(); + pEffect->End(); +} + +/* + * Compile + */ +ErrorCode Bot::Compile(Code* pInstance, uint8* pData, uint32 nSize) +{ + const uint32 nLength = pInstance->GetLength(); + + for(uint32 i = 0; i < nLength; ++i) + { + const uint32 nAction = pInstance->GetSlot(i); + + if(Action_Forward <= nAction && nAction <= Action_Light) + { + if(nSize < 2) + return Error_Fail; + + *pData++ = Instruction_Action; + *pData++ = nAction; + + nSize -= 2; + } + else + + if(Action_FunctionA <= nAction && nAction <= Action_FunctionB) + { + if(nSize < 2) + return Error_Fail; + + *pData++ = Instruction_Call; + *pData++ = nAction - Action_FunctionA + 1; + + nSize -= 2; + } + } + + return Error_Success; +} + +/* + * SetupVertexBuffer + */ +ErrorCode Bot::SetupVertexBuffer() +{ + Vertex::Block* pVertices = NULL; + + HRESULT hResult = pVertexBuffer->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD); + if(FAILED(hResult)) + { + return Error_Fail; + } + + const float fU1 = 0.66f; + const float fV1 = 0.66f; + + // front + pVertices[0] = Vertex::Block(-0.5f, 0.0f, -0.5f, 0.0f, 0.0f, -1.0f, 0.00f, 1.00f); + pVertices[1] = Vertex::Block(-0.5f, 1.0f, -0.5f, 0.0f, 0.0f, -1.0f, 0.00f, 0.66f); + pVertices[2] = Vertex::Block(+0.5f, 1.0f, -0.5f, 0.0f, 0.0f, -1.0f, 1.00f, 0.66f); + pVertices[3] = Vertex::Block(-0.5f, 0.0f, -0.5f, 0.0f, 0.0f, -1.0f, 0.00f, 1.00f); + pVertices[4] = Vertex::Block(+0.5f, 1.0f, -0.5f, 0.0f, 0.0f, -1.0f, 1.00f, 0.66f); + pVertices[5] = Vertex::Block(+0.5f, 0.0f, -0.5f, 0.0f, 0.0f, -1.0f, 1.00f, 1.00f); + // back + pVertices[6] = Vertex::Block(+0.5f, 0.0f, +0.5f, 0.0f, 0.0f, +1.0f, 0.00f, 1.00f); + pVertices[7] = Vertex::Block(+0.5f, 1.0f, +0.5f, 0.0f, 0.0f, +1.0f, 0.00f, 0.66f); + pVertices[8] = Vertex::Block(-0.5f, 1.0f, +0.5f, 0.0f, 0.0f, +1.0f, 1.00f, 0.66f); + pVertices[9] = Vertex::Block(+0.5f, 0.0f, +0.5f, 0.0f, 0.0f, +1.0f, 0.00f, 1.00f); + pVertices[10] = Vertex::Block(-0.5f, 1.0f, +0.5f, 0.0f, 0.0f, +1.0f, 1.00f, 0.66f); + pVertices[11] = Vertex::Block(-0.5f, 0.0f, +0.5f, 0.0f, 0.0f, +1.0f, 1.00f, 1.00f); + // left + pVertices[12] = Vertex::Block(-0.5f, 0.0f, +0.5f, -1.0f, 0.0f, 0.0f, 0.00f, 1.00f); + pVertices[13] = Vertex::Block(-0.5f, 1.0f, +0.5f, -1.0f, 0.0f, 0.0f, 0.00f, 0.66f); + pVertices[14] = Vertex::Block(-0.5f, 1.0f, -0.5f, -1.0f, 0.0f, 0.0f, 1.00f, 0.66f); + pVertices[15] = Vertex::Block(-0.5f, 0.0f, +0.5f, -1.0f, 0.0f, 0.0f, 0.00f, 1.00f); + pVertices[16] = Vertex::Block(-0.5f, 1.0f, -0.5f, -1.0f, 0.0f, 0.0f, 1.00f, 0.66f); + pVertices[17] = Vertex::Block(-0.5f, 0.0f, -0.5f, -1.0f, 0.0f, 0.0f, 1.00f, 1.00f); + // right + pVertices[18] = Vertex::Block(+0.5f, 0.0f, -0.5f, +1.0f, 0.0f, 0.0f, 0.00f, 1.00f); + pVertices[19] = Vertex::Block(+0.5f, 1.0f, -0.5f, +1.0f, 0.0f, 0.0f, 0.00f, 0.66f); + pVertices[20] = Vertex::Block(+0.5f, 1.0f, +0.5f, +1.0f, 0.0f, 0.0f, 1.00f, 0.66f); + pVertices[21] = Vertex::Block(+0.5f, 0.0f, -0.5f, +1.0f, 0.0f, 0.0f, 0.00f, 1.00f); + pVertices[22] = Vertex::Block(+0.5f, 1.0f, +0.5f, +1.0f, 0.0f, 0.0f, 1.00f, 0.66f); + pVertices[23] = Vertex::Block(+0.5f, 0.0f, +0.5f, +1.0f, 0.0f, 0.0f, 1.00f, 1.00f); + // top + pVertices[24] = Vertex::Block(-0.5f, 1.0f, -0.5f, 0.0f, +1.0f, 0.0f, 0.00f, 0.66f); + pVertices[25] = Vertex::Block(-0.5f, 1.0f, +0.5f, 0.0f, +1.0f, 0.0f, 0.00f, 0.00f); + pVertices[26] = Vertex::Block(+0.5f, 1.0f, +0.5f, 0.0f, +1.0f, 0.0f, 1.00f, 0.00f); + pVertices[27] = Vertex::Block(-0.5f, 1.0f, -0.5f, 0.0f, +1.0f, 0.0f, 0.00f, 0.66f); + pVertices[28] = Vertex::Block(+0.5f, 1.0f, +0.5f, 0.0f, +1.0f, 0.0f, 1.00f, 0.00f); + pVertices[29] = Vertex::Block(+0.5f, 1.0f, -0.5f, 0.0f, +1.0f, 0.0f, 1.00f, 0.66f); + // bottom + pVertices[30] = Vertex::Block(-0.5f, 0.0f, +0.5f, 0.0f, -1.0f, 0.0f, 0.00f, 0.66f); + pVertices[31] = Vertex::Block(-0.5f, 0.0f, -0.5f, 0.0f, -1.0f, 0.0f, 0.00f, 0.00f); + pVertices[32] = Vertex::Block(+0.5f, 0.0f, -0.5f, 0.0f, -1.0f, 0.0f, 1.00f, 0.00f); + pVertices[33] = Vertex::Block(-0.5f, 0.0f, +0.5f, 0.0f, -1.0f, 0.0f, 0.00f, 0.66f); + pVertices[34] = Vertex::Block(+0.5f, 0.0f, -0.5f, 0.0f, -1.0f, 0.0f, 1.00f, 0.00f); + pVertices[35] = Vertex::Block(+0.5f, 0.0f, +0.5f, 0.0f, -1.0f, 0.0f, 1.00f, 0.66f); + + pVertexBuffer->Unlock(); + + return Error_Success; +} diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/Bot.h --- a/LightClone/Source/Bot.h Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/Bot.h Fri Sep 09 18:36:18 2011 -0700 @@ -6,6 +6,8 @@ #define __BOT_H__ #include "Core.h" +#include "RenderContext.h" +#include "ResourceManager.h" #include "VirtualMachine.h" #include "Environment.h" #include "Code.h" @@ -78,6 +80,21 @@ private: /* + * pEffect + */ + ID3DXEffect* pEffect; + + /* + * pVertexBuffer + */ + IDirect3DVertexBuffer9* pVertexBuffer; + + /* + * pTexture + */ + IDirect3DTexture9* pTexture; + + /* * pEnvironment */ Environment* pEnvironment; @@ -135,7 +152,17 @@ /* * Reset */ - void Initialize(Environment* pInstance); + ErrorCode Initialize(ResourceManager* pResourceManager); + + /* + * Terminate + */ + void Terminate(); + + /* + * Setup + */ + void Setup(Environment* pInstance); /* * Reset @@ -167,12 +194,22 @@ */ bool Update(float fElapsed); + /* + * Render + */ + void Render(RenderContext& kContext, Camera& kCamera); + private: /* * Compile */ ErrorCode Compile(Code* pCode, uint8* pData, uint32 nSize); + + /* + * SetupVertexBuffer + */ + ErrorCode SetupVertexBuffer(); }; #endif //__BOT_H__ diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/Camera.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LightClone/Source/Camera.cpp Fri Sep 09 18:36:18 2011 -0700 @@ -0,0 +1,12 @@ +/* + * Camera + */ + +#include "Camera.h" + +/* + * ~Camera + */ +Camera::~Camera() +{ +} \ No newline at end of file diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/Camera.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LightClone/Source/Camera.h Fri Sep 09 18:36:18 2011 -0700 @@ -0,0 +1,43 @@ +/* + * Camera + */ + +#ifndef __CAMERA_H__ +#define __CAMERA_H__ + +#include "Core.h" + +/* + * Camera + */ +class Camera +{ +public: + + /* + * ~Camera + */ + virtual ~Camera(); + + /* + * GetLocation + */ + virtual const D3DXVECTOR3 GetLocation() const = 0; + + /* + * GetDirection + */ + virtual const D3DXVECTOR3 GetDirection() const = 0; + + /* + * GetRight + */ + virtual const D3DXVECTOR3 GetRight() const = 0; + + /* + * GetUp + */ + virtual const D3DXVECTOR3 GetUp() const = 0; +}; + +#endif //__CAMERA_H__ diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/CameraController.cpp --- a/LightClone/Source/CameraController.cpp Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/CameraController.cpp Fri Sep 09 18:36:18 2011 -0700 @@ -48,11 +48,35 @@ /* * GetLocation */ -const D3DXVECTOR3 CameraController::GetLocation(const D3DXVECTOR3& kTarget) const +const D3DXVECTOR3 CameraController::GetLocation() const { const float fOffsetX = fCameraDistance * sinf(0.5f * D3DX_PI - fCameraPitch) * cosf(fCameraYaw); const float fOffsetY = fCameraDistance * cosf(0.5f * D3DX_PI - fCameraPitch); const float fOffsetZ = fCameraDistance * sinf(0.5f * D3DX_PI - fCameraPitch) * sinf(fCameraYaw); - return D3DXVECTOR3(kTarget.x + fOffsetX, kTarget.y + fOffsetY, kTarget.z + fOffsetZ); + return D3DXVECTOR3(fOffsetX, fOffsetY, fOffsetZ); +} + +/* + * GetDirection + */ +const D3DXVECTOR3 CameraController::GetDirection() const +{ + return D3DXVECTOR3(0.0f, 0.0f, 1.0f); } + +/* + * GetRight + */ +const D3DXVECTOR3 CameraController::GetRight() const +{ + return D3DXVECTOR3(1.0f, 0.0f, 0.0f); +} + +/* + * GetUp + */ +const D3DXVECTOR3 CameraController::GetUp() const +{ + return D3DXVECTOR3(0.0f, 1.0f, 0.0f); +} diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/CameraController.h --- a/LightClone/Source/CameraController.h Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/CameraController.h Fri Sep 09 18:36:18 2011 -0700 @@ -6,11 +6,12 @@ #define __CAMERACONTROLLER_H__ #include "Core.h" +#include "Camera.h" /* * CameraController */ -class CameraController +class CameraController : public Camera { public: @@ -34,7 +35,6 @@ /* * CameraController */ - //CameraController(float fInitialDistance = 16.0f, float fInitialYaw = D3DX_PI / 6.0f, float fInitialPitch = D3DX_PI / 4.0); CameraController(float fInitialDistance = 16.0f, float fInitialYaw = 0.306f, float fInitialPitch = 0.875f); /* @@ -60,7 +60,22 @@ /* * GetLocation */ - const D3DXVECTOR3 GetLocation(const D3DXVECTOR3& kTarget) const; + virtual const D3DXVECTOR3 GetLocation() const; + + /* + * GetDirection + */ + virtual const D3DXVECTOR3 GetDirection() const; + + /* + * GetRight + */ + virtual const D3DXVECTOR3 GetRight() const; + + /* + * GetUp + */ + virtual const D3DXVECTOR3 GetUp() const; }; #endif //__CAMERACONTROLLER_H__ diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/Core.h --- a/LightClone/Source/Core.h Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/Core.h Fri Sep 09 18:36:18 2011 -0700 @@ -60,6 +60,29 @@ }; /* + * GameState + */ +enum +{ + GameState_Idle, + GameState_LoadMap, + GameState_Active, + GameState_Complete, + GameState_Over, + GameState_Confirm, + GameState_Exit, +}; + +/* + * SimulationState + */ +enum +{ + SimulationState_Idle, + SimulationState_Active, +}; + +/* * Action */ enum diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/Interface.cpp --- a/LightClone/Source/Interface.cpp Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/Interface.cpp Fri Sep 09 18:36:18 2011 -0700 @@ -221,7 +221,7 @@ /* * Render */ -void Interface::Render(RenderContext& kContext) +void Interface::Render(RenderContext& kContext, Camera& kCamera) { /* if(pModel->nGameState != GameState_Exit) @@ -663,3 +663,9 @@ } */ } + + +/* +Drag & Drop Handling: + 1. Separate into 2 stages: drag detection and drop detection +*/ \ No newline at end of file diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/Interface.h --- a/LightClone/Source/Interface.h Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/Interface.h Fri Sep 09 18:36:18 2011 -0700 @@ -86,7 +86,7 @@ /* * Render */ - void Render(RenderContext& kContext); + void Render(RenderContext& kContext, Camera& kCamera); private: diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/Mediator.cpp --- a/LightClone/Source/Mediator.cpp Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/Mediator.cpp Fri Sep 09 18:36:18 2011 -0700 @@ -4,7 +4,6 @@ #include "Mediator.h" #include "VertexTypes.h" -//#include #pragma warning(disable:4355) @@ -16,65 +15,9 @@ /* * Mediator */ -Mediator::Mediator() : kWindow(this), kToolbar(8), kMain(16), kFunction(8), kControls(4) +Mediator::Mediator() : kWindow(this) { - nGameState = GameState_Active; - nSimulationState = SimulationState_Idle; - pFunction = 0; - nCurrentFunction = 0; - nCurrentLevel = 0; - - kArrowBounds[0] = Rectangle2(1206.0f + 0 * 16.0f, 473.0f + 0 * 54.0f, 16.0f, 16.0f); - kArrowBounds[1] = Rectangle2(1206.0f + 2 * 16.0f, 473.0f + 0 * 54.0f, 16.0f, 16.0f); - - kDialog1Bounds[0] = Rectangle2(567.0f, 412.0f, 150.0f, 60.0f); - - kDialog2Bounds[0] = Rectangle2(1023.0f + 2.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); - kDialog2Bounds[1] = Rectangle2(1023.0f + 2.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); - - kToolbar.Add(1023.0f + 0 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); - kToolbar.Add(1023.0f + 1 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); - kToolbar.Add(1023.0f + 2 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); - kToolbar.Add(1023.0f + 3 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); - kToolbar.Add(1023.0f + 0 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); - kToolbar.Add(1023.0f + 1 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); - kToolbar.Add(1023.0f + 2 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); - kToolbar.Add(1023.0f + 3 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); - - kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); - kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); - - kFunction.Add(1023.0f + 0 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); - kFunction.Add(1023.0f + 1 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); - kFunction.Add(1023.0f + 2 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); - kFunction.Add(1023.0f + 3 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); - kFunction.Add(1023.0f + 0 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); - kFunction.Add(1023.0f + 1 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); - kFunction.Add(1023.0f + 2 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); - kFunction.Add(1023.0f + 3 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); - - kControls.Add(1023.0f + 0.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); - kControls.Add(1023.0f + 1.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); - kControls.Add(1023.0f + 2.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); - - pGraphicsDevice = NULL; - pBlockEffect = NULL; - pBlockVertexBuffer = NULL; - pBlockTexture = NULL; + pGraphicsDevice = NULL; } /* @@ -89,8 +32,7 @@ kClock.Reset(); - while(nGameState != GameState_Exit) - //while(pWorld->IsActive()) + while(kWorld.IsActive()) { ProcessMessages(); @@ -139,59 +81,6 @@ */ ErrorCode Mediator::Initialize() { - /* - ErrorCode eCode = kWindow.Initialize(); - if(eCode == Error_Success) - { - eCode = GraphicsDevice::Create(kWindow, ScreenSizeX, ScreenSizeY, &pGraphicsDevice); - if(eCode == Error_Success) - { - eCode = kRenderContext.Initialize(pGraphicsDevice); - if(eCode == Error_Success) - { - //NOTE: This seems like a big hack. Why does the resource manager - // need to be aware of the graphics device just to load resources? - // This could be replaced by a "resource loader" which is owned - // by the graphics device and registered to the resource manager - eCode = kResourceManager.Initialize(pGraphicsDevice); - if(eCode == Error_Success) - { - eCode = kInputManager.Initialize(kWindow); - if(eCode == Error_Success) - { - eCode = kWorld.Initialize(&kResourceManager); - if(eCode == Error_Success) - { - eCode = kInputManager.Register(&kWorld); - if(eCode == Error_Success) - { - kWorld.Activate(); - } - } - } - } - } - } - } - */ - - /* - pModel = new Model(); - pView = new View(pModel); - pController = new Controller(pModel, pView); - - ErrorCode eCode = pView->Initialize(); - if(eCode == Error_Success) - { - eCode = pController->Initialize(); - if(eCode == Error_Success) - { - nCurrentLevel = 0; - nGameState = GameState_LoadMap; - } - } - */ - ErrorCode eCode = kWindow.Initialize(); if(eCode == Error_Success) { @@ -223,43 +112,12 @@ return Error_Fail; } - eCode = kResourceManager.CreateEffectFromFile("Data\\Shaders\\Environment.fx", &pBlockEffect); - if(eCode != Error_Success) - { - Terminate(); - return Error_Fail; - } - - eCode = kResourceManager.CreateTextureFromFile("Data\\Textures\\Block02.tga", &pBlockTexture); + eCode = kWorld.Initialize(&kResourceManager, &kInputManager); if(eCode != Error_Success) { Terminate(); return Error_Fail; } - - eCode = kResourceManager.CreateVertexBuffer(VerticesPerBlock * sizeof(Vertex::Block), D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED, &pBlockVertexBuffer); - if(eCode != Error_Success) - { - Terminate(); - return Error_Fail; - } - - eCode = SetupVertexBuffer(); - if(eCode != Error_Success) - { - Terminate(); - return Error_Fail; - } - - eCode = kInterface.Initialize(&kResourceManager); - if(eCode != Error_Success) - { - Terminate(); - return Error_Fail; - } - - nCurrentLevel = 0; - nGameState = GameState_LoadMap; } return eCode; @@ -270,29 +128,10 @@ */ void Mediator::Terminate() { - kInterface.Terminate(); - - if(pBlockVertexBuffer) - { - pBlockVertexBuffer->Release(); - pBlockVertexBuffer = NULL; - } - - if(pBlockTexture) - { - pBlockTexture->Release(); - pBlockTexture = NULL; - } - - if(pBlockEffect) - { - pBlockEffect->Release(); - pBlockEffect = 0; - } - - kContext.Terminate(); + kWorld.Terminate(); kInputManager.Terminate(); kResourceManager.Terminate(); + kContext.Terminate(); GraphicsDevice::Destroy(pGraphicsDevice); } @@ -302,35 +141,7 @@ */ void Mediator::Update(float fElapsed) { - ProcessInput(fElapsed); - - if(nGameState == GameState_LoadMap) - { - char kBuffer[256]; - sprintf_s(kBuffer, "Data\\Maps\\Map%02d.map", nCurrentLevel++); - - nGameState = Load(kBuffer) ? GameState_Active : GameState_Over; - } - else - - if(nGameState == GameState_Active) - { - if(nSimulationState == SimulationState_Active) - { - if(kBot.Update(fElapsed)) - { - if(kEnvironment.RequirementsMet()) - { - kDialog.Reset("Some message"); - kDialog.AddButton(DialogButton_Ok, "Ok", 0.0f, 0.0f, 0.0f, 0.0f); - - nGameState = GameState_Complete; - } - } - } - } - - //kWorld.Update(fElapsed); + kWorld.Update(fElapsed); } /* @@ -338,19 +149,7 @@ */ void Mediator::Render() { - const uint32 nColor = D3DCOLOR_XRGB(32, 32, 32); - - kContext.Begin(nColor); - - if(nGameState >= GameState_Active) - { - Render3D(); - Render2D(); - } - - kContext.End(); - - //kWorld.Render(kRenderContext); + kWorld.Render(kContext); } /* @@ -364,8 +163,7 @@ { if(kMessage.message == WM_QUIT) { - nGameState = GameState_Exit; - //kWorld.Deactivate(); + kWorld.Deactivate(); break; } @@ -373,606 +171,3 @@ DispatchMessage(&kMessage); } } - -/* - * Load - */ -bool Mediator::Load(const char* pName) -{ - ErrorCode eCode = kLoader.Load(pName); - if(eCode == Error_Success) - { - if(pFunction) - { - delete[] pFunction; - pFunction = NULL; - } - - const Size& kSize = kLoader.GetSize(); - - eCode = kEnvironment.Initialize(kSize.X, kSize.Y); - if(eCode == Error_Success) - { - for(uint32 nY = 0; nY < kSize.Y; ++nY) - { - for(uint32 nX = 0; nX < kSize.X; ++nX) - { - kEnvironment.SetType(nX, nY, kLoader.GetTowerType(nX, nY)); - kEnvironment.SetAltitude(nX, nY, kLoader.GetTowerHeight(nX, nY)); - } - } - - kBot.Initialize(&kEnvironment); - kBot.kPosition = kLoader.GetInitialPosition(); - kBot.kDirection = kLoader.GetInitialDirection(); - - const uint32 nCount = kLoader.GetFunctionCount(); - - pFunction = new Code[nCount + 1]; - pFunction[0].Initialize(MainFunctionLength); - pFunction[0].Clear(); - - for(uint32 i = 0; i < nCount; ++i) - { - const uint32 nLength = kLoader.GetFunctionLength(i); - - pFunction[i + 1].Initialize(nLength); - pFunction[i + 1].Clear(); - } - } - } - - return eCode == Error_Success; -} - -/* - * ResetEnvironment - */ -void Mediator::ResetEnvironment() -{ - kEnvironment.Reset(); -} - -/* - * ResetBot - */ -void Mediator::ResetBot() -{ - kBot.Reset(); - kBot.kPosition = kLoader.GetInitialPosition(); - kBot.kDirection = kLoader.GetInitialDirection(); -} - -/* - * ResetCode - */ -void Mediator::ClearCode() -{ - for(uint32 i = 0; i < kLoader.GetFunctionCount(); ++i) - { - pFunction[i].Clear(); - } -} - -/* - * SetupVertexBuffer - */ -ErrorCode Mediator::SetupVertexBuffer() -{ - Vertex::Block* pVertices = NULL; - - HRESULT hResult = pBlockVertexBuffer->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD); - if(FAILED(hResult)) - { - return Error_Fail; - } - - const float fU1 = 0.66f; - const float fV1 = 0.66f; - - // front - pVertices[0] = Vertex::Block(-0.5f, 0.0f, -0.5f, 0.0f, 0.0f, -1.0f, 0.00f, 1.00f); - pVertices[1] = Vertex::Block(-0.5f, 1.0f, -0.5f, 0.0f, 0.0f, -1.0f, 0.00f, 0.66f); - pVertices[2] = Vertex::Block(+0.5f, 1.0f, -0.5f, 0.0f, 0.0f, -1.0f, 1.00f, 0.66f); - pVertices[3] = Vertex::Block(-0.5f, 0.0f, -0.5f, 0.0f, 0.0f, -1.0f, 0.00f, 1.00f); - pVertices[4] = Vertex::Block(+0.5f, 1.0f, -0.5f, 0.0f, 0.0f, -1.0f, 1.00f, 0.66f); - pVertices[5] = Vertex::Block(+0.5f, 0.0f, -0.5f, 0.0f, 0.0f, -1.0f, 1.00f, 1.00f); - // back - pVertices[6] = Vertex::Block(+0.5f, 0.0f, +0.5f, 0.0f, 0.0f, +1.0f, 0.00f, 1.00f); - pVertices[7] = Vertex::Block(+0.5f, 1.0f, +0.5f, 0.0f, 0.0f, +1.0f, 0.00f, 0.66f); - pVertices[8] = Vertex::Block(-0.5f, 1.0f, +0.5f, 0.0f, 0.0f, +1.0f, 1.00f, 0.66f); - pVertices[9] = Vertex::Block(+0.5f, 0.0f, +0.5f, 0.0f, 0.0f, +1.0f, 0.00f, 1.00f); - pVertices[10] = Vertex::Block(-0.5f, 1.0f, +0.5f, 0.0f, 0.0f, +1.0f, 1.00f, 0.66f); - pVertices[11] = Vertex::Block(-0.5f, 0.0f, +0.5f, 0.0f, 0.0f, +1.0f, 1.00f, 1.00f); - // left - pVertices[12] = Vertex::Block(-0.5f, 0.0f, +0.5f, -1.0f, 0.0f, 0.0f, 0.00f, 1.00f); - pVertices[13] = Vertex::Block(-0.5f, 1.0f, +0.5f, -1.0f, 0.0f, 0.0f, 0.00f, 0.66f); - pVertices[14] = Vertex::Block(-0.5f, 1.0f, -0.5f, -1.0f, 0.0f, 0.0f, 1.00f, 0.66f); - pVertices[15] = Vertex::Block(-0.5f, 0.0f, +0.5f, -1.0f, 0.0f, 0.0f, 0.00f, 1.00f); - pVertices[16] = Vertex::Block(-0.5f, 1.0f, -0.5f, -1.0f, 0.0f, 0.0f, 1.00f, 0.66f); - pVertices[17] = Vertex::Block(-0.5f, 0.0f, -0.5f, -1.0f, 0.0f, 0.0f, 1.00f, 1.00f); - // right - pVertices[18] = Vertex::Block(+0.5f, 0.0f, -0.5f, +1.0f, 0.0f, 0.0f, 0.00f, 1.00f); - pVertices[19] = Vertex::Block(+0.5f, 1.0f, -0.5f, +1.0f, 0.0f, 0.0f, 0.00f, 0.66f); - pVertices[20] = Vertex::Block(+0.5f, 1.0f, +0.5f, +1.0f, 0.0f, 0.0f, 1.00f, 0.66f); - pVertices[21] = Vertex::Block(+0.5f, 0.0f, -0.5f, +1.0f, 0.0f, 0.0f, 0.00f, 1.00f); - pVertices[22] = Vertex::Block(+0.5f, 1.0f, +0.5f, +1.0f, 0.0f, 0.0f, 1.00f, 0.66f); - pVertices[23] = Vertex::Block(+0.5f, 0.0f, +0.5f, +1.0f, 0.0f, 0.0f, 1.00f, 1.00f); - // top - pVertices[24] = Vertex::Block(-0.5f, 1.0f, -0.5f, 0.0f, +1.0f, 0.0f, 0.00f, 0.66f); - pVertices[25] = Vertex::Block(-0.5f, 1.0f, +0.5f, 0.0f, +1.0f, 0.0f, 0.00f, 0.00f); - pVertices[26] = Vertex::Block(+0.5f, 1.0f, +0.5f, 0.0f, +1.0f, 0.0f, 1.00f, 0.00f); - pVertices[27] = Vertex::Block(-0.5f, 1.0f, -0.5f, 0.0f, +1.0f, 0.0f, 0.00f, 0.66f); - pVertices[28] = Vertex::Block(+0.5f, 1.0f, +0.5f, 0.0f, +1.0f, 0.0f, 1.00f, 0.00f); - pVertices[29] = Vertex::Block(+0.5f, 1.0f, -0.5f, 0.0f, +1.0f, 0.0f, 1.00f, 0.66f); - // bottom - pVertices[30] = Vertex::Block(-0.5f, 0.0f, +0.5f, 0.0f, -1.0f, 0.0f, 0.00f, 0.66f); - pVertices[31] = Vertex::Block(-0.5f, 0.0f, -0.5f, 0.0f, -1.0f, 0.0f, 0.00f, 0.00f); - pVertices[32] = Vertex::Block(+0.5f, 0.0f, -0.5f, 0.0f, -1.0f, 0.0f, 1.00f, 0.00f); - pVertices[33] = Vertex::Block(-0.5f, 0.0f, +0.5f, 0.0f, -1.0f, 0.0f, 0.00f, 0.66f); - pVertices[34] = Vertex::Block(+0.5f, 0.0f, -0.5f, 0.0f, -1.0f, 0.0f, 1.00f, 0.00f); - pVertices[35] = Vertex::Block(+0.5f, 0.0f, +0.5f, 0.0f, -1.0f, 0.0f, 1.00f, 0.66f); - - pBlockVertexBuffer->Unlock(); - - return Error_Success; -} - -/* - * Render3D - */ -void Mediator::Render3D() -{ - const D3DXVECTOR3& kScale = kEnvironment.GetScale(); - const uint32 nSizeX = kEnvironment.GetWidth(); - const uint32 nSizeY = kEnvironment.GetHeight(); - - //const D3DXVECTOR3 kTarget(0.5f * (nSizeX - 1) * kScale.x, 0.0f, 0.5f * (nSizeY - 1) * kScale.z); - const D3DXVECTOR3 kTarget(0.0f, 0.0f, 0.0f); - - kContext.SetupCamera3D(pBlockEffect, kCameraController.GetLocation(kTarget), kTarget); - - RenderEnvironment(&kEnvironment); - RenderBot(&kEnvironment, &kBot); -} - -/* - * Render2D - */ -void Mediator::Render2D() -{ - kInterface.Render(kContext); -} - -/* - * RenderEnvironment - */ -void Mediator::RenderEnvironment(Environment* pEnvironment) -{ - const D3DXVECTOR3& kScale = pEnvironment->GetScale(); - - uint32 nPasses = 0; - - pBlockEffect->SetTechnique(pBlockEffect->GetTechnique(0)); - pBlockEffect->Begin(&nPasses, 0); - pBlockEffect->BeginPass(0); - - D3DXMATRIX kScaleMatrix; - D3DXMatrixScaling(&kScaleMatrix, kScale.x, kScale.y, kScale.z); - - const uint32 nSizeX = pEnvironment->GetWidth(); - const uint32 nSizeY = pEnvironment->GetHeight(); - - const D3DXMATRIX& kProjection = kContext.GetProjection(); - const D3DXMATRIX& kView = kContext.GetView(); - - D3DVIEWPORT9 kViewport; - kContext.GetViewport(&kViewport); - - D3DXVECTOR3 kCenterWorld(0.0f, 0.0f, 0.0f); - const float fMagicOffset = 400.0f; - //const D3DXVECTOR3& kCenterWorld = ComputeOrigin(0.5f * (ScreenSizeX - (304.0f + fMagicOffset)), 0.5f * ScreenSizeY, kViewport, kProjection, kView); - - const float fOffsetX = -0.5f * (nSizeX * kScale.x); - const float fOffsetZ = -0.5f * (nSizeY * kScale.z); - - for(uint32 nZ = 0; nZ < nSizeY; ++nZ) - { - for(uint32 nX = 0; nX < nSizeX; ++nX) - { - uint32 nType = pEnvironment->GetType(nX, nZ); - uint32 nHeight = pEnvironment->GetAltitude(nX, nZ); - uint32 nState = pEnvironment->GetState(nX, nZ); - uint32 nColor = D3DCOLOR_XRGB(0x80, 0x80, 0x80); - - if(nType == 1) - { - nColor = nState ? D3DCOLOR_XRGB(0, 0, 255) : D3DCOLOR_XRGB(255, 0, 0); - } - - for(uint32 i = 0; i < pEnvironment->GetAltitude(nX, nZ); ++i) - { - D3DXMATRIX kTranslateMatrix; - D3DXMatrixTranslation(&kTranslateMatrix, fOffsetX + (kCenterWorld.x + nX) * kScale.x, i * kScale.y, fOffsetZ + (kCenterWorld.z + nZ) * kScale.z); - - D3DXMATRIX kWorldMatrix; - D3DXMatrixMultiply(&kWorldMatrix, &kScaleMatrix, &kTranslateMatrix); - - const float fAlpha = ((nColor >> 24) & 0xFF) / 255.0f; - const float fRed = ((nColor >> 16) & 0xFF) / 255.0f; - const float fGreen = ((nColor >> 8 ) & 0xFF) / 255.0f; - const float fBlue = ((nColor >> 0 ) & 0xFF) / 255.0f; - - const D3DXVECTOR4 kColorVector(fRed, fGreen, fBlue, fAlpha); - - pBlockEffect->SetMatrix(pBlockEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); - pBlockEffect->SetVector(pBlockEffect->GetParameterByName(NULL, "kColor"), &kColorVector); - pBlockEffect->SetTexture(pBlockEffect->GetParameterByName(NULL, "kTexture"), pBlockTexture); - pBlockEffect->CommitChanges(); - - kContext.DrawTriangles(Vertex::Block::Declaration, pBlockVertexBuffer, sizeof(Vertex::Block), FacesPerCube * TrianglesPerFace); - } - } - } - - pBlockEffect->EndPass(); - pBlockEffect->End(); - - if(false) // wireframe - { - pBlockEffect->SetTechnique(pBlockEffect->GetTechniqueByName("Wire")); - pBlockEffect->Begin(&nPasses, 0); - pBlockEffect->BeginPass(0); - - for(uint32 nZ = 0; nZ < nSizeY; ++nZ) - { - for(uint32 nX = 0; nX < nSizeX; ++nX) - { - for(uint32 i = 0; i < pEnvironment->GetAltitude(nX, nZ); ++i) - { - D3DXMATRIX kTranslateMatrix; - D3DXMatrixTranslation(&kTranslateMatrix, nX * kScale.x, i * kScale.y, nZ * kScale.z); - - D3DXMATRIX kWorldMatrix; - D3DXMatrixMultiply(&kWorldMatrix, &kScaleMatrix, &kTranslateMatrix); - - const D3DXVECTOR4 kColorVector(0.0f, 0.0f, 0.0f, 1.0f); - - pBlockEffect->SetMatrix(pBlockEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); - pBlockEffect->SetVector(pBlockEffect->GetParameterByName(NULL, "kColor"), &kColorVector); - pBlockEffect->SetTexture(pBlockEffect->GetParameterByName(NULL, "kTexture"), pBlockTexture); - pBlockEffect->CommitChanges(); - - kContext.DrawTriangles(Vertex::Block::Declaration, pBlockVertexBuffer, sizeof(Vertex::Block), FacesPerCube * TrianglesPerFace); - } - } - } - - pBlockEffect->EndPass(); - pBlockEffect->End(); - } -} - -/* - * RenderBot - */ -void Mediator::RenderBot(Environment* pEnvironment, Bot* pBot) -{ - const D3DXVECTOR3& kPosition = pBot->GetWorldPosition(); - const D3DXVECTOR3& kOrientation = pBot->GetWorldOrientation(); - - const float fOffsetX = -0.5f * (pEnvironment->GetWidth() * pEnvironment->GetScale().x); - const float fOffsetZ = -0.5f * (pEnvironment->GetHeight() * pEnvironment->GetScale().z); - - uint32 nPasses = 0; - - pBlockEffect->SetTechnique(pBlockEffect->GetTechnique(0)); - pBlockEffect->Begin(&nPasses, 0); - pBlockEffect->BeginPass(0); - - D3DXMATRIX kScale; - D3DXMatrixScaling(&kScale, pBot->kSize.x, pBot->kSize.y, pBot->kSize.z); - - D3DXMATRIX kTranslate; - D3DXMatrixTranslation(&kTranslate, fOffsetX + kPosition.x, kPosition.y, fOffsetZ + kPosition.z); - - D3DXMATRIX kRotate; - D3DXMatrixRotationY(&kRotate, kOrientation.y); - - D3DXMATRIX kTempMatrix; - D3DXMATRIX kWorldMatrix; - D3DXMatrixMultiply(&kWorldMatrix, D3DXMatrixMultiply(&kTempMatrix, &kScale, &kRotate), &kTranslate); - - const float fAlpha = ((pBot->nColor >> 24) & 0xFF) / 255.0f; - const float fRed = ((pBot->nColor >> 16) & 0xFF) / 255.0f; - const float fGreen = ((pBot->nColor >> 8 ) & 0xFF) / 255.0f; - const float fBlue = ((pBot->nColor >> 0 ) & 0xFF) / 255.0f; - - const D3DXVECTOR4 kColorVector(fRed, fGreen, fBlue, fAlpha); - - pBlockEffect->SetMatrix(pBlockEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); - pBlockEffect->SetVector(pBlockEffect->GetParameterByName(NULL, "kColor"), &kColorVector); - pBlockEffect->SetTexture(pBlockEffect->GetParameterByName(NULL, "kTexture"), NULL); - pBlockEffect->CommitChanges(); - - kContext.DrawTriangles(Vertex::Block::Declaration, pBlockVertexBuffer, sizeof(Vertex::Block), FacesPerCube * TrianglesPerFace); - - pBlockEffect->EndPass(); - pBlockEffect->End(); -} - -/* - * ProcessInput - */ -void Mediator::ProcessInput(float fElapsed) -{ - kInputManager.Update(fElapsed); - - #if defined(_DEBUG) - if(kInputManager.IsKeyDown(DIK_LEFT)) - { - //pView->UpdateCameraYaw(0.01f); - kCameraController.Yaw(0.01f); - } - else - - if(kInputManager.IsKeyDown(DIK_RIGHT)) - { - //pView->UpdateCameraYaw(-0.01f); - kCameraController.Yaw(-0.01f); - } - - if(kInputManager.IsKeyDown(DIK_UP)) - { - //pView->UpdateCameraPitch(0.01f); - kCameraController.Pitch(0.01f); - } - else - - if(kInputManager.IsKeyDown(DIK_DOWN)) - { - //pView->UpdateCameraPitch(-0.01f); - kCameraController.Pitch(-0.01f); - } - - if(kInputManager.IsKeyDown(DIK_NEXT)) - { - //pView->UpdateCameraDistance(0.1f); - kCameraController.Move(0.1f); - } - else - - if(kInputManager.IsKeyDown(DIK_PRIOR)) - { - //pView->UpdateCameraDistance(-0.1f); - kCameraController.Move(-0.1f); - } - #endif - - const float fMouseX = kInputManager.GetMouseX(); - const float fMouseY = kInputManager.GetMouseY(); - - if(nGameState == GameState_Active) - { - if(kInputManager.IsButtonDown(0) && !kInputManager.WasButtonDown(0)) - { - int32 nSelection = kControls.Pick(fMouseX, fMouseY); - if(nSelection >= 0) - { - if(nSelection == ControlButton_Play) - { - if(nSimulationState == SimulationState_Idle) - { - ResetBot(); - kBot.Upload(pFunction, kLoader.GetFunctionCount() + 1); - - nSimulationState = SimulationState_Active; - } - } - else - - if(nSelection == ControlButton_Stop) - { - if(nSimulationState == SimulationState_Active) - { - ResetEnvironment(); - ResetBot(); - - nSimulationState = SimulationState_Idle; - } - } - else - - if(nSelection == ControlButton_Exit) - { - nGameState = GameState_Exit; - } - } - else - { - // pick against the toolbar - nSelection = kToolbar.Pick(fMouseX, fMouseY); - if(nSelection >= 0) - { - kDragController.Begin(Action_Forward + nSelection); - } - else - { - // pick against the main pane - nSelection = kMain.Pick(fMouseX, fMouseY); - if(nSelection >= 0) - { - Code* pCode = pFunction; - if(!pCode->IsEmptySlot(nSelection)) - { - kDragController.Begin(pCode->GetSlot(nSelection)); - pCode->ClearSlot(nSelection); - } - } - else - { - // pick against the function pane - nSelection = kFunction.Pick(fMouseX, fMouseY); - if(nSelection >= 0) - { - Code* pCode = pFunction + nCurrentFunction + 1; - if(!pCode->IsEmptySlot(nSelection)) - { - kDragController.Begin(pCode->GetSlot(nSelection)); - pCode->ClearSlot(nSelection); - } - } - else - { - // pick against the function pane arrows - for(uint32 i = 0; i < sizeof(kArrowBounds) / sizeof(kArrowBounds[0]); ++i) - { - if(kArrowBounds[i].Contains(fMouseX, fMouseY)) - { - const uint32 nCount = kLoader.GetFunctionCount(); - nCurrentFunction = (nCurrentFunction + 2 * (int32)i - 1 + nCount) % nCount; - } - } - } - } - } - } - } - else - - if(!kInputManager.IsButtonDown(0) && kInputManager.WasButtonDown(0)) - { - if(kDragController.IsActive()) - { - const uint32 nAction = kDragController.End(); - - int32 nSelection = kMain.Pick(fMouseX, fMouseY); - if(nSelection >= 0) - { - pFunction[0].SetSlot(nSelection, nAction); - } - else - { - nSelection = kFunction.Pick(fMouseX, fMouseY); - if(nSelection >= 0) - { - pFunction[nCurrentFunction + 1].SetSlot(nSelection, nAction); - } - } - } - } - } - else - - if(nGameState == GameState_Complete) - { - if(kInputManager.IsButtonDown(0) && !kInputManager.WasButtonDown(0)) - { - for(uint32 i = 0; i < sizeof(kDialog1Bounds) / sizeof(kDialog1Bounds[0]); ++i) - { - if(kDialog1Bounds[i].Contains(fMouseX, fMouseY)) - { - if(i == 0) - { - if(nSimulationState == SimulationState_Active) - { - ResetEnvironment(); - ResetBot(); - - nSimulationState = SimulationState_Idle; - } - - nGameState = GameState_LoadMap; - } - } - } - - /* - int32 nSelection = kDialog.Pick(fMouseX, fMouseY); - - if(nSelection == DialogButton_A) - { - if(nSimulationState == SimulationState_Active) - { - ResetEnvironment(); - ResetBot(); - - nSimulationState = SimulationState_Idle; - } - - nGameState = GameState_LoadMap; - } - */ - } - } - else - - if(nGameState == GameState_Over) - { - // check to see if button was clicked - if(kInputManager.IsButtonDown(0) && !kInputManager.WasButtonDown(0)) - { - for(uint32 i = 0; i < sizeof(kDialog1Bounds) / sizeof(kDialog1Bounds[0]); ++i) - { - if(kDialog1Bounds[i].Contains(fMouseX, fMouseY)) - { - if(i == 0) - { - nCurrentLevel = 0; - nGameState = GameState_LoadMap; - } - } - } - - /* - int32 nSelection = kDialog.Pick(fMouseX, fMouseY); - - if(nSelection == DialogButton_A) - { - nCurrentLevel = 0; - nGameState = GameState_LoadMap; - } - */ - } - } - else - - if(nGameState == GameState_Confirm) - { - // check to see if button was clicked - if(kInputManager.IsButtonDown(0) && !kInputManager.WasButtonDown(0)) - { - for(uint32 i = 0; i < sizeof(kDialog2Bounds) / sizeof(kDialog2Bounds[0]); ++i) - { - if(kDialog2Bounds[i].Contains(fMouseX, fMouseY)) - { - if(i == 0) - { - nGameState = GameState_Exit; - } - else - - if(i == 1) - { - nGameState = GameState_Active; - } - } - } - - /* - int32 nSelection = kDialog.Pick(fMouseX, fMouseY); - - if(nSelection == DialogButton_A) - { - nGameState = GameState_Exit; - } - else - - if(nSelection == DialogButton_B) - { - nGameState = GameState_Active; - } - */ - } - } -} diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/Mediator.h --- a/LightClone/Source/Mediator.h Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/Mediator.h Fri Sep 09 18:36:18 2011 -0700 @@ -9,10 +9,7 @@ #include "Clock.h" #include "Window.h" #include "InputManager.h" -#include "Loader.h" -#include "Environment.h" -#include "Bot.h" -#include "Code.h" +#include "World.h" #include "DragController.h" #include "ButtonPane.h" #include "Dialog.h" @@ -23,41 +20,6 @@ #include "Interface.h" /* - * MediatorState - */ -enum -{ - MediatorState_Initialize, - MediatorState_Splash, - MediatorState_Game, - MediatorState_Complete, - MediatorState_Exit, -}; - -/* - * GameState - */ -enum -{ - GameState_Idle, - GameState_LoadMap, - GameState_Active, - GameState_Complete, - GameState_Over, - GameState_Confirm, - GameState_Exit, -}; - -/* - * SimulationState - */ -enum -{ - SimulationState_Idle, - SimulationState_Active, -}; - -/* * Mediator */ class Mediator : public WindowCallback @@ -73,96 +35,6 @@ Clock kClock; /* - * kLoader - */ - Loader kLoader; - - /* - * kEnvironment - */ - Environment kEnvironment; - - /* - * kBot - */ - Bot kBot; - - /* - * kFunction - */ - Code* pFunction; - - /* - * nGameState - */ - uint32 nGameState; - - /* - * nSimulationState - */ - uint32 nSimulationState; - - /* - * nCurrentLevel - */ - uint32 nCurrentLevel; - - /* - * nCurrentFunction - */ - uint32 nCurrentFunction; - - /* - * kInputManager - */ - InputManager kInputManager; - - /* - * kDragController - */ - DragController kDragController; - - /* - * kToolbar - */ - ButtonPane kToolbar; - - /* - * kMain - */ - ButtonPane kMain; - - /* - * kFunction - */ - ButtonPane kFunction; - - /* - * kControlBounds - */ - ButtonPane kControls; - - /* - * kArrowBounds - */ - Rectangle2 kArrowBounds[2]; - - /* - * kDialog1Bounds - */ - Rectangle2 kDialog1Bounds[1]; - - /* - * kDialog2Bounds - */ - Rectangle2 kDialog2Bounds[2]; - - /* - * kDialog - */ - Dialog kDialog; - - /* * pGraphicsDevice */ GraphicsDevice* pGraphicsDevice; @@ -178,34 +50,14 @@ RenderContext kContext; /* - * kCameraController - * Move to World + * kInputManager */ - CameraController kCameraController; - - /* - * pBlockEffect - * Move to World - */ - ID3DXEffect* pBlockEffect; + InputManager kInputManager; /* - * pBlockVertexBuffer - * Move to World + * kWorld */ - IDirect3DVertexBuffer9* pBlockVertexBuffer; - - /* - * pBlockTexture - * Move to World - */ - IDirect3DTexture9* pBlockTexture; - - /* - * kInterface - * Move to World - */ - Interface kInterface; + World kWorld; public: @@ -250,56 +102,6 @@ * ProcessMessages */ virtual void ProcessMessages(); - - /* - * Load - */ - bool Load(const char* pName); - - /* - * ResetEnvironment - */ - void ResetEnvironment(); - - /* - * ResetBot - */ - void ResetBot(); - - /* - * ResetCode - */ - void ClearCode(); - - /* - * SetupVertexBuffer - */ - ErrorCode SetupVertexBuffer(); - - /* - * Render3D - */ - void Render3D(); - - /* - * Render2D - */ - void Render2D(); - - /* - * RenderEnvironment - */ - void RenderEnvironment(Environment* pEnvironment); - - /* - * RenderBot - */ - void RenderBot(Environment* pEnvironment, Bot* pBot); - - /* - * ProcessInput - */ - void ProcessInput(float fElapsed); }; #endif //__MEDIATOR_H__ diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/RenderContext.cpp --- a/LightClone/Source/RenderContext.cpp Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/RenderContext.cpp Fri Sep 09 18:36:18 2011 -0700 @@ -118,6 +118,14 @@ } /* + * Apply + */ +void RenderContext::Apply(Camera& kCamera, ID3DXEffect* pEffect) +{ + //TODO: +} + +/* * SetupCamera3D */ void RenderContext::SetupCamera3D(ID3DXEffect* pEffect, const D3DXVECTOR3& kLocation, const D3DXVECTOR3& kTarget, float fViewAngle) diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/RenderContext.h --- a/LightClone/Source/RenderContext.h Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/RenderContext.h Fri Sep 09 18:36:18 2011 -0700 @@ -7,6 +7,7 @@ #include "Core.h" #include "GraphicsDevice.h" +#include "Camera.h" /* * RenderContext @@ -86,6 +87,11 @@ void End(); /* + * Apply + */ + void Apply(Camera& kCamera, ID3DXEffect* pEffect); + + /* * SetupCamera3D */ void SetupCamera3D(ID3DXEffect* pEffect, const D3DXVECTOR3& kLocation, const D3DXVECTOR3& kTarget, float fViewAngle = D3DX_PI / 4.0f); diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/World.cpp --- a/LightClone/Source/World.cpp Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/World.cpp Fri Sep 09 18:36:18 2011 -0700 @@ -3,36 +3,109 @@ */ #include "World.h" +#include "VertexTypes.h" /* * World */ -World::World() +World::World() : kToolbar(8), kMain(16), kFunction(8), kControls(4) { + pBlockEffect = NULL; + pBlockVertexBuffer = NULL; + pBlockTexture = NULL; + + nGameState = GameState_Active; + nSimulationState = SimulationState_Idle; + pFunction = 0; + nCurrentFunction = 0; + nCurrentLevel = 0; + + kArrowBounds[0] = Rectangle2(1206.0f + 0 * 16.0f, 473.0f + 0 * 54.0f, 16.0f, 16.0f); + kArrowBounds[1] = Rectangle2(1206.0f + 2 * 16.0f, 473.0f + 0 * 54.0f, 16.0f, 16.0f); + + kDialog1Bounds[0] = Rectangle2(567.0f, 412.0f, 150.0f, 60.0f); + + kDialog2Bounds[0] = Rectangle2(1023.0f + 2.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); + kDialog2Bounds[1] = Rectangle2(1023.0f + 2.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); + + kToolbar.Add(1023.0f + 0 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); + kToolbar.Add(1023.0f + 1 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); + kToolbar.Add(1023.0f + 2 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); + kToolbar.Add(1023.0f + 3 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); + kToolbar.Add(1023.0f + 0 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); + kToolbar.Add(1023.0f + 1 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); + kToolbar.Add(1023.0f + 2 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); + kToolbar.Add(1023.0f + 3 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); + + kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); + kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); + + kFunction.Add(1023.0f + 0 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); + kFunction.Add(1023.0f + 1 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); + kFunction.Add(1023.0f + 2 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); + kFunction.Add(1023.0f + 3 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); + kFunction.Add(1023.0f + 0 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); + kFunction.Add(1023.0f + 1 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); + kFunction.Add(1023.0f + 2 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); + kFunction.Add(1023.0f + 3 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); + + kControls.Add(1023.0f + 0.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); + kControls.Add(1023.0f + 1.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); + kControls.Add(1023.0f + 2.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); } /* * Initialize */ -ErrorCode World::Initialize() +ErrorCode World::Initialize(ResourceManager* pResourceManager, InputManager* pInput) { ErrorCode eCode = Error_Fail; - /* - eCode = kEnvironment.Initialize(); - if(eCode == Error_Success) + if(pResourceManager && pInput) { - eCode = kBot.Initialize(&kEnvironment); + pInputManager = pInput; + + eCode = pResourceManager->CreateEffectFromFile("Data\\Shaders\\Environment.fx", &pBlockEffect); if(eCode == Error_Success) { - eCode = kProgram.Initialize(); + eCode = pResourceManager->CreateTextureFromFile("Data\\Textures\\Block02.tga", &pBlockTexture); if(eCode == Error_Success) { - eCode = kInterface.Initialize(); + eCode = pResourceManager->CreateVertexBuffer(VerticesPerBlock * sizeof(Vertex::Block), D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED, &pBlockVertexBuffer); + if(eCode == Error_Success) + { + eCode = SetupVertexBuffer(); + if(eCode == Error_Success) + { + eCode = kInterface.Initialize(pResourceManager); + if(eCode == Error_Success) + { + eCode = kBot.Initialize(pResourceManager); + if(eCode == Error_Success) + { + nCurrentLevel = 0; + nGameState = GameState_LoadMap; + } + } + } + } } } } - */ return eCode; } @@ -42,29 +115,705 @@ */ void World::Terminate() { + kInterface.Terminate(); + kBot.Terminate(); + + if(pBlockVertexBuffer) + { + pBlockVertexBuffer->Release(); + pBlockVertexBuffer = NULL; + } + + if(pBlockTexture) + { + pBlockTexture->Release(); + pBlockTexture = NULL; + } + + if(pBlockEffect) + { + pBlockEffect->Release(); + pBlockEffect = 0; + } + /* - kInterface.Terminate(); kProgram.Terminate(); - kBot.Terminate(); kEnvironment.Terminate(); */ } /* + * Activate + */ +void World::Activate() +{ + nGameState = GameState_LoadMap; +} + +/* + * Deactivate + */ +void World::Deactivate() +{ + nGameState = GameState_Exit; +} + +/* + * IsActive + */ +bool World::IsActive() +{ + return nGameState != GameState_Exit; +} + +/* + * Load + */ +bool World::Load(const char* pName) +{ + ErrorCode eCode = kLoader.Load(pName); + if(eCode == Error_Success) + { + if(pFunction) + { + delete[] pFunction; + pFunction = NULL; + } + + const Size& kSize = kLoader.GetSize(); + + eCode = kEnvironment.Initialize(kSize.X, kSize.Y); + if(eCode == Error_Success) + { + for(uint32 nY = 0; nY < kSize.Y; ++nY) + { + for(uint32 nX = 0; nX < kSize.X; ++nX) + { + kEnvironment.SetType(nX, nY, kLoader.GetTowerType(nX, nY)); + kEnvironment.SetAltitude(nX, nY, kLoader.GetTowerHeight(nX, nY)); + } + } + + kBot.Setup(&kEnvironment); + kBot.kPosition = kLoader.GetInitialPosition(); + kBot.kDirection = kLoader.GetInitialDirection(); + + const uint32 nCount = kLoader.GetFunctionCount(); + + pFunction = new Code[nCount + 1]; + pFunction[0].Initialize(MainFunctionLength); + pFunction[0].Clear(); + + for(uint32 i = 0; i < nCount; ++i) + { + const uint32 nLength = kLoader.GetFunctionLength(i); + + pFunction[i + 1].Initialize(nLength); + pFunction[i + 1].Clear(); + } + } + } + + return eCode == Error_Success; +} + +/* + * ResetEnvironment + */ +void World::ResetEnvironment() +{ + kEnvironment.Reset(); +} + +/* + * ResetBot + */ +void World::ResetBot() +{ + kBot.Reset(); + kBot.kPosition = kLoader.GetInitialPosition(); + kBot.kDirection = kLoader.GetInitialDirection(); +} + +/* + * ResetCode + */ +void World::ClearCode() +{ + for(uint32 i = 0; i < kLoader.GetFunctionCount(); ++i) + { + pFunction[i].Clear(); + } +} + +/* * Update */ void World::Update(float fElapsed) { - //kBot.Update(fElapsed); - //kEnvironment.Update(fElapsed); - //kInterface.Update(fElapsed); + ProcessInput(fElapsed); + + if(nGameState == GameState_LoadMap) + { + char kBuffer[256]; + sprintf_s(kBuffer, "Data\\Maps\\Map%02d.map", nCurrentLevel++); + + nGameState = Load(kBuffer) ? GameState_Active : GameState_Over; + } + else + + if(nGameState == GameState_Active) + { + if(nSimulationState == SimulationState_Active) + { + if(kBot.Update(fElapsed)) + { + if(kEnvironment.RequirementsMet()) + { + kDialog.Reset("Some message"); + kDialog.AddButton(DialogButton_Ok, "Ok", 0.0f, 0.0f, 0.0f, 0.0f); + + nGameState = GameState_Complete; + } + } + } + } } /* * Render */ -void World::Render() +void World::Render(RenderContext& kContext) +{ + const uint32 nColor = D3DCOLOR_XRGB(32, 32, 32); + + kContext.Begin(nColor); + + if(nGameState >= GameState_Active) + { + Render3D(kContext); + Render2D(kContext); + } + + kContext.End(); +} + +/* + * SetupVertexBuffer + */ +ErrorCode World::SetupVertexBuffer() +{ + Vertex::Block* pVertices = NULL; + + HRESULT hResult = pBlockVertexBuffer->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD); + if(FAILED(hResult)) + { + return Error_Fail; + } + + const float fU1 = 0.66f; + const float fV1 = 0.66f; + + // front + pVertices[0] = Vertex::Block(-0.5f, 0.0f, -0.5f, 0.0f, 0.0f, -1.0f, 0.00f, 1.00f); + pVertices[1] = Vertex::Block(-0.5f, 1.0f, -0.5f, 0.0f, 0.0f, -1.0f, 0.00f, 0.66f); + pVertices[2] = Vertex::Block(+0.5f, 1.0f, -0.5f, 0.0f, 0.0f, -1.0f, 1.00f, 0.66f); + pVertices[3] = Vertex::Block(-0.5f, 0.0f, -0.5f, 0.0f, 0.0f, -1.0f, 0.00f, 1.00f); + pVertices[4] = Vertex::Block(+0.5f, 1.0f, -0.5f, 0.0f, 0.0f, -1.0f, 1.00f, 0.66f); + pVertices[5] = Vertex::Block(+0.5f, 0.0f, -0.5f, 0.0f, 0.0f, -1.0f, 1.00f, 1.00f); + // back + pVertices[6] = Vertex::Block(+0.5f, 0.0f, +0.5f, 0.0f, 0.0f, +1.0f, 0.00f, 1.00f); + pVertices[7] = Vertex::Block(+0.5f, 1.0f, +0.5f, 0.0f, 0.0f, +1.0f, 0.00f, 0.66f); + pVertices[8] = Vertex::Block(-0.5f, 1.0f, +0.5f, 0.0f, 0.0f, +1.0f, 1.00f, 0.66f); + pVertices[9] = Vertex::Block(+0.5f, 0.0f, +0.5f, 0.0f, 0.0f, +1.0f, 0.00f, 1.00f); + pVertices[10] = Vertex::Block(-0.5f, 1.0f, +0.5f, 0.0f, 0.0f, +1.0f, 1.00f, 0.66f); + pVertices[11] = Vertex::Block(-0.5f, 0.0f, +0.5f, 0.0f, 0.0f, +1.0f, 1.00f, 1.00f); + // left + pVertices[12] = Vertex::Block(-0.5f, 0.0f, +0.5f, -1.0f, 0.0f, 0.0f, 0.00f, 1.00f); + pVertices[13] = Vertex::Block(-0.5f, 1.0f, +0.5f, -1.0f, 0.0f, 0.0f, 0.00f, 0.66f); + pVertices[14] = Vertex::Block(-0.5f, 1.0f, -0.5f, -1.0f, 0.0f, 0.0f, 1.00f, 0.66f); + pVertices[15] = Vertex::Block(-0.5f, 0.0f, +0.5f, -1.0f, 0.0f, 0.0f, 0.00f, 1.00f); + pVertices[16] = Vertex::Block(-0.5f, 1.0f, -0.5f, -1.0f, 0.0f, 0.0f, 1.00f, 0.66f); + pVertices[17] = Vertex::Block(-0.5f, 0.0f, -0.5f, -1.0f, 0.0f, 0.0f, 1.00f, 1.00f); + // right + pVertices[18] = Vertex::Block(+0.5f, 0.0f, -0.5f, +1.0f, 0.0f, 0.0f, 0.00f, 1.00f); + pVertices[19] = Vertex::Block(+0.5f, 1.0f, -0.5f, +1.0f, 0.0f, 0.0f, 0.00f, 0.66f); + pVertices[20] = Vertex::Block(+0.5f, 1.0f, +0.5f, +1.0f, 0.0f, 0.0f, 1.00f, 0.66f); + pVertices[21] = Vertex::Block(+0.5f, 0.0f, -0.5f, +1.0f, 0.0f, 0.0f, 0.00f, 1.00f); + pVertices[22] = Vertex::Block(+0.5f, 1.0f, +0.5f, +1.0f, 0.0f, 0.0f, 1.00f, 0.66f); + pVertices[23] = Vertex::Block(+0.5f, 0.0f, +0.5f, +1.0f, 0.0f, 0.0f, 1.00f, 1.00f); + // top + pVertices[24] = Vertex::Block(-0.5f, 1.0f, -0.5f, 0.0f, +1.0f, 0.0f, 0.00f, 0.66f); + pVertices[25] = Vertex::Block(-0.5f, 1.0f, +0.5f, 0.0f, +1.0f, 0.0f, 0.00f, 0.00f); + pVertices[26] = Vertex::Block(+0.5f, 1.0f, +0.5f, 0.0f, +1.0f, 0.0f, 1.00f, 0.00f); + pVertices[27] = Vertex::Block(-0.5f, 1.0f, -0.5f, 0.0f, +1.0f, 0.0f, 0.00f, 0.66f); + pVertices[28] = Vertex::Block(+0.5f, 1.0f, +0.5f, 0.0f, +1.0f, 0.0f, 1.00f, 0.00f); + pVertices[29] = Vertex::Block(+0.5f, 1.0f, -0.5f, 0.0f, +1.0f, 0.0f, 1.00f, 0.66f); + // bottom + pVertices[30] = Vertex::Block(-0.5f, 0.0f, +0.5f, 0.0f, -1.0f, 0.0f, 0.00f, 0.66f); + pVertices[31] = Vertex::Block(-0.5f, 0.0f, -0.5f, 0.0f, -1.0f, 0.0f, 0.00f, 0.00f); + pVertices[32] = Vertex::Block(+0.5f, 0.0f, -0.5f, 0.0f, -1.0f, 0.0f, 1.00f, 0.00f); + pVertices[33] = Vertex::Block(-0.5f, 0.0f, +0.5f, 0.0f, -1.0f, 0.0f, 0.00f, 0.66f); + pVertices[34] = Vertex::Block(+0.5f, 0.0f, -0.5f, 0.0f, -1.0f, 0.0f, 1.00f, 0.00f); + pVertices[35] = Vertex::Block(+0.5f, 0.0f, +0.5f, 0.0f, -1.0f, 0.0f, 1.00f, 0.66f); + + pBlockVertexBuffer->Unlock(); + + return Error_Success; +} + +/* + * Render3D + */ +void World::Render3D(RenderContext& kContext) +{ + const D3DXVECTOR3& kScale = kEnvironment.GetScale(); + const uint32 nSizeX = kEnvironment.GetWidth(); + const uint32 nSizeY = kEnvironment.GetHeight(); + + //const D3DXVECTOR3 kTarget(0.5f * (nSizeX - 1) * kScale.x, 0.0f, 0.5f * (nSizeY - 1) * kScale.z); + const D3DXVECTOR3 kTarget(0.0f, 0.0f, 0.0f); + + kContext.SetupCamera3D(pBlockEffect, kTarget + kCameraController.GetLocation(), kTarget); + + RenderEnvironment(kContext, &kEnvironment); + RenderBot(kContext, &kEnvironment, &kBot); +} + +/* + * Render2D + */ +void World::Render2D(RenderContext& kContext) +{ + kInterface.Render(kContext, kCameraController); +} + +/* + * RenderEnvironment + */ +void World::RenderEnvironment(RenderContext& kContext, Environment* pEnvironment) +{ + const D3DXVECTOR3& kScale = pEnvironment->GetScale(); + + uint32 nPasses = 0; + + pBlockEffect->SetTechnique(pBlockEffect->GetTechnique(0)); + pBlockEffect->Begin(&nPasses, 0); + pBlockEffect->BeginPass(0); + + D3DXMATRIX kScaleMatrix; + D3DXMatrixScaling(&kScaleMatrix, kScale.x, kScale.y, kScale.z); + + const uint32 nSizeX = pEnvironment->GetWidth(); + const uint32 nSizeY = pEnvironment->GetHeight(); + + const D3DXMATRIX& kProjection = kContext.GetProjection(); + const D3DXMATRIX& kView = kContext.GetView(); + + D3DVIEWPORT9 kViewport; + kContext.GetViewport(&kViewport); + + D3DXVECTOR3 kCenterWorld(0.0f, 0.0f, 0.0f); + const float fMagicOffset = 400.0f; + //const D3DXVECTOR3& kCenterWorld = ComputeOrigin(0.5f * (ScreenSizeX - (304.0f + fMagicOffset)), 0.5f * ScreenSizeY, kViewport, kProjection, kView); + + const float fOffsetX = -0.5f * (nSizeX * kScale.x); + const float fOffsetZ = -0.5f * (nSizeY * kScale.z); + + for(uint32 nZ = 0; nZ < nSizeY; ++nZ) + { + for(uint32 nX = 0; nX < nSizeX; ++nX) + { + uint32 nType = pEnvironment->GetType(nX, nZ); + uint32 nHeight = pEnvironment->GetAltitude(nX, nZ); + uint32 nState = pEnvironment->GetState(nX, nZ); + uint32 nColor = D3DCOLOR_XRGB(0x80, 0x80, 0x80); + + if(nType == 1) + { + nColor = nState ? D3DCOLOR_XRGB(0, 0, 255) : D3DCOLOR_XRGB(255, 0, 0); + } + + for(uint32 i = 0; i < pEnvironment->GetAltitude(nX, nZ); ++i) + { + D3DXMATRIX kTranslateMatrix; + D3DXMatrixTranslation(&kTranslateMatrix, fOffsetX + (kCenterWorld.x + nX) * kScale.x, i * kScale.y, fOffsetZ + (kCenterWorld.z + nZ) * kScale.z); + + D3DXMATRIX kWorldMatrix; + D3DXMatrixMultiply(&kWorldMatrix, &kScaleMatrix, &kTranslateMatrix); + + const float fAlpha = ((nColor >> 24) & 0xFF) / 255.0f; + const float fRed = ((nColor >> 16) & 0xFF) / 255.0f; + const float fGreen = ((nColor >> 8 ) & 0xFF) / 255.0f; + const float fBlue = ((nColor >> 0 ) & 0xFF) / 255.0f; + + const D3DXVECTOR4 kColorVector(fRed, fGreen, fBlue, fAlpha); + + pBlockEffect->SetMatrix(pBlockEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); + pBlockEffect->SetVector(pBlockEffect->GetParameterByName(NULL, "kColor"), &kColorVector); + pBlockEffect->SetTexture(pBlockEffect->GetParameterByName(NULL, "kTexture"), pBlockTexture); + pBlockEffect->CommitChanges(); + + kContext.DrawTriangles(Vertex::Block::Declaration, pBlockVertexBuffer, sizeof(Vertex::Block), FacesPerCube * TrianglesPerFace); + } + } + } + + pBlockEffect->EndPass(); + pBlockEffect->End(); + + if(false) // wireframe + { + pBlockEffect->SetTechnique(pBlockEffect->GetTechniqueByName("Wire")); + pBlockEffect->Begin(&nPasses, 0); + pBlockEffect->BeginPass(0); + + for(uint32 nZ = 0; nZ < nSizeY; ++nZ) + { + for(uint32 nX = 0; nX < nSizeX; ++nX) + { + for(uint32 i = 0; i < pEnvironment->GetAltitude(nX, nZ); ++i) + { + D3DXMATRIX kTranslateMatrix; + D3DXMatrixTranslation(&kTranslateMatrix, nX * kScale.x, i * kScale.y, nZ * kScale.z); + + D3DXMATRIX kWorldMatrix; + D3DXMatrixMultiply(&kWorldMatrix, &kScaleMatrix, &kTranslateMatrix); + + const D3DXVECTOR4 kColorVector(0.0f, 0.0f, 0.0f, 1.0f); + + pBlockEffect->SetMatrix(pBlockEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); + pBlockEffect->SetVector(pBlockEffect->GetParameterByName(NULL, "kColor"), &kColorVector); + pBlockEffect->SetTexture(pBlockEffect->GetParameterByName(NULL, "kTexture"), pBlockTexture); + pBlockEffect->CommitChanges(); + + kContext.DrawTriangles(Vertex::Block::Declaration, pBlockVertexBuffer, sizeof(Vertex::Block), FacesPerCube * TrianglesPerFace); + } + } + } + + pBlockEffect->EndPass(); + pBlockEffect->End(); + } +} + +/* + * RenderBot + */ +void World::RenderBot(RenderContext& kContext, Environment* pEnvironment, Bot* pBot) { - //Render3D(); - //Render2D(); + //* + const D3DXVECTOR3& kPosition = pBot->GetWorldPosition(); + const D3DXVECTOR3& kOrientation = pBot->GetWorldOrientation(); + + const float fOffsetX = -0.5f * (pEnvironment->GetWidth() * pEnvironment->GetScale().x); + const float fOffsetZ = -0.5f * (pEnvironment->GetHeight() * pEnvironment->GetScale().z); + + uint32 nPasses = 0; + + pBlockEffect->SetTechnique(pBlockEffect->GetTechnique(0)); + pBlockEffect->Begin(&nPasses, 0); + pBlockEffect->BeginPass(0); + + D3DXMATRIX kScale; + D3DXMatrixScaling(&kScale, pBot->kSize.x, pBot->kSize.y, pBot->kSize.z); + + D3DXMATRIX kTranslate; + D3DXMatrixTranslation(&kTranslate, fOffsetX + kPosition.x, kPosition.y, fOffsetZ + kPosition.z); + + D3DXMATRIX kRotate; + D3DXMatrixRotationY(&kRotate, kOrientation.y); + + D3DXMATRIX kTempMatrix; + D3DXMATRIX kWorldMatrix; + D3DXMatrixMultiply(&kWorldMatrix, D3DXMatrixMultiply(&kTempMatrix, &kScale, &kRotate), &kTranslate); + + const float fAlpha = ((pBot->nColor >> 24) & 0xFF) / 255.0f; + const float fRed = ((pBot->nColor >> 16) & 0xFF) / 255.0f; + const float fGreen = ((pBot->nColor >> 8 ) & 0xFF) / 255.0f; + const float fBlue = ((pBot->nColor >> 0 ) & 0xFF) / 255.0f; + + const D3DXVECTOR4 kColorVector(fRed, fGreen, fBlue, fAlpha); + + pBlockEffect->SetMatrix(pBlockEffect->GetParameterByName(NULL, "kWorld"), &kWorldMatrix); + pBlockEffect->SetVector(pBlockEffect->GetParameterByName(NULL, "kColor"), &kColorVector); + pBlockEffect->SetTexture(pBlockEffect->GetParameterByName(NULL, "kTexture"), NULL); + pBlockEffect->CommitChanges(); + + kContext.DrawTriangles(Vertex::Block::Declaration, pBlockVertexBuffer, sizeof(Vertex::Block), FacesPerCube * TrianglesPerFace); + + pBlockEffect->EndPass(); + pBlockEffect->End(); + //*/ + //kBot.Render(kContext, kCameraController); } + +/* + * ProcessInput + */ +void World::ProcessInput(float fElapsed) +{ + pInputManager->Update(fElapsed); + + #if defined(_DEBUG) + if(pInputManager->IsKeyDown(DIK_LEFT)) + { + kCameraController.Yaw(0.01f); + } + else + + if(pInputManager->IsKeyDown(DIK_RIGHT)) + { + kCameraController.Yaw(-0.01f); + } + + if(pInputManager->IsKeyDown(DIK_UP)) + { + kCameraController.Pitch(0.01f); + } + else + + if(pInputManager->IsKeyDown(DIK_DOWN)) + { + kCameraController.Pitch(-0.01f); + } + + if(pInputManager->IsKeyDown(DIK_NEXT)) + { + kCameraController.Move(0.1f); + } + else + + if(pInputManager->IsKeyDown(DIK_PRIOR)) + { + kCameraController.Move(-0.1f); + } + #endif + + const float fMouseX = pInputManager->GetMouseX(); + const float fMouseY = pInputManager->GetMouseY(); + + if(nGameState == GameState_Active) + { + if(pInputManager->IsButtonDown(0) && !pInputManager->WasButtonDown(0)) + { + int32 nSelection = kControls.Pick(fMouseX, fMouseY); + if(nSelection >= 0) + { + if(nSelection == ControlButton_Play) + { + if(nSimulationState == SimulationState_Idle) + { + ResetBot(); + kBot.Upload(pFunction, kLoader.GetFunctionCount() + 1); + + nSimulationState = SimulationState_Active; + } + } + else + + if(nSelection == ControlButton_Stop) + { + if(nSimulationState == SimulationState_Active) + { + ResetEnvironment(); + ResetBot(); + + nSimulationState = SimulationState_Idle; + } + } + else + + if(nSelection == ControlButton_Exit) + { + nGameState = GameState_Exit; + } + } + else + { + // pick against the toolbar + nSelection = kToolbar.Pick(fMouseX, fMouseY); + if(nSelection >= 0) + { + kDragController.Begin(Action_Forward + nSelection); + } + else + { + // pick against the main pane + nSelection = kMain.Pick(fMouseX, fMouseY); + if(nSelection >= 0) + { + Code* pCode = pFunction; + if(!pCode->IsEmptySlot(nSelection)) + { + kDragController.Begin(pCode->GetSlot(nSelection)); + pCode->ClearSlot(nSelection); + } + } + else + { + // pick against the function pane + nSelection = kFunction.Pick(fMouseX, fMouseY); + if(nSelection >= 0) + { + Code* pCode = pFunction + nCurrentFunction + 1; + if(!pCode->IsEmptySlot(nSelection)) + { + kDragController.Begin(pCode->GetSlot(nSelection)); + pCode->ClearSlot(nSelection); + } + } + else + { + // pick against the function pane arrows + for(uint32 i = 0; i < sizeof(kArrowBounds) / sizeof(kArrowBounds[0]); ++i) + { + if(kArrowBounds[i].Contains(fMouseX, fMouseY)) + { + const uint32 nCount = kLoader.GetFunctionCount(); + nCurrentFunction = (nCurrentFunction + 2 * (int32)i - 1 + nCount) % nCount; + } + } + } + } + } + } + } + else + + if(!pInputManager->IsButtonDown(0) && pInputManager->WasButtonDown(0)) + { + if(kDragController.IsActive()) + { + const uint32 nAction = kDragController.End(); + + int32 nSelection = kMain.Pick(fMouseX, fMouseY); + if(nSelection >= 0) + { + pFunction[0].SetSlot(nSelection, nAction); + } + else + { + nSelection = kFunction.Pick(fMouseX, fMouseY); + if(nSelection >= 0) + { + pFunction[nCurrentFunction + 1].SetSlot(nSelection, nAction); + } + } + } + } + } + else + + if(nGameState == GameState_Complete) + { + if(pInputManager->IsButtonDown(0) && !pInputManager->WasButtonDown(0)) + { + for(uint32 i = 0; i < sizeof(kDialog1Bounds) / sizeof(kDialog1Bounds[0]); ++i) + { + if(kDialog1Bounds[i].Contains(fMouseX, fMouseY)) + { + if(i == 0) + { + if(nSimulationState == SimulationState_Active) + { + ResetEnvironment(); + ResetBot(); + + nSimulationState = SimulationState_Idle; + } + + nGameState = GameState_LoadMap; + } + } + } + + /* + int32 nSelection = kDialog.Pick(fMouseX, fMouseY); + + if(nSelection == DialogButton_A) + { + if(nSimulationState == SimulationState_Active) + { + ResetEnvironment(); + ResetBot(); + + nSimulationState = SimulationState_Idle; + } + + nGameState = GameState_LoadMap; + } + */ + } + } + else + + if(nGameState == GameState_Over) + { + // check to see if button was clicked + if(pInputManager->IsButtonDown(0) && !pInputManager->WasButtonDown(0)) + { + for(uint32 i = 0; i < sizeof(kDialog1Bounds) / sizeof(kDialog1Bounds[0]); ++i) + { + if(kDialog1Bounds[i].Contains(fMouseX, fMouseY)) + { + if(i == 0) + { + nCurrentLevel = 0; + nGameState = GameState_LoadMap; + } + } + } + + /* + int32 nSelection = kDialog.Pick(fMouseX, fMouseY); + + if(nSelection == DialogButton_A) + { + nCurrentLevel = 0; + nGameState = GameState_LoadMap; + } + */ + } + } + else + + if(nGameState == GameState_Confirm) + { + // check to see if button was clicked + if(pInputManager->IsButtonDown(0) && !pInputManager->WasButtonDown(0)) + { + for(uint32 i = 0; i < sizeof(kDialog2Bounds) / sizeof(kDialog2Bounds[0]); ++i) + { + if(kDialog2Bounds[i].Contains(fMouseX, fMouseY)) + { + if(i == 0) + { + nGameState = GameState_Exit; + } + else + + if(i == 1) + { + nGameState = GameState_Active; + } + } + } + + /* + int32 nSelection = kDialog.Pick(fMouseX, fMouseY); + + if(nSelection == DialogButton_A) + { + nGameState = GameState_Exit; + } + else + + if(nSelection == DialogButton_B) + { + nGameState = GameState_Active; + } + */ + } + } +} diff -r 968341ab1fb2 -r e494c4295dba LightClone/Source/World.h --- a/LightClone/Source/World.h Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/Source/World.h Fri Sep 09 18:36:18 2011 -0700 @@ -6,6 +6,18 @@ #define __WORLD_H__ #include "Core.h" +#include "RenderContext.h" +#include "Environment.h" +#include "Bot.h" +#include "Code.h" +#include "Loader.h" +#include "CameraController.h" +#include "DragController.h" +#include "ResourceManager.h" +#include "InputManager.h" +#include "ButtonPane.h" +#include "Dialog.h" +#include "Interface.h" /* * World @@ -13,27 +25,123 @@ class World { /* + * pInputManager + */ + InputManager* pInputManager; + + /* + * kLoader + */ + Loader kLoader; + + /* * kEnvironment - * The environment is the grid on which the bot is placed and with which it interacts */ - //Environment kEnvironment; + Environment kEnvironment; /* * kBot - * Represents the robot programmed to solve the challenges + */ + Bot kBot; + + /* + * kFunction + */ + Code* pFunction; + + /* + * nGameState + */ + uint32 nGameState; + + /* + * nSimulationState + */ + uint32 nSimulationState; + + /* + * nCurrentLevel */ - //Bot kBot; + uint32 nCurrentLevel; + + /* + * nCurrentFunction + */ + uint32 nCurrentFunction; + + /* + * kCameraController + */ + CameraController kCameraController; + + /* + * kDragController + */ + DragController kDragController; + + /* + * kToolbar + */ + ButtonPane kToolbar; /* - * kProgram - * Stores the current program being edited by the player + * kMain + */ + ButtonPane kMain; + + /* + * kFunction + */ + ButtonPane kFunction; + + /* + * kControlBounds + */ + ButtonPane kControls; + + /* + * kArrowBounds + */ + Rectangle2 kArrowBounds[2]; + + /* + * kDialog1Bounds */ + Rectangle2 kDialog1Bounds[1]; + + /* + * kDialog2Bounds + */ + Rectangle2 kDialog2Bounds[2]; + + /* + * pBlockEffect + * Move to World + */ + ID3DXEffect* pBlockEffect; + + /* + * pBlockVertexBuffer + * Move to World + */ + IDirect3DVertexBuffer9* pBlockVertexBuffer; + + /* + * pBlockTexture + * Move to World + */ + IDirect3DTexture9* pBlockTexture; /* * kInterface - * Manages the tree of UI elements + * Move to World */ - //Interface kInterface; + Interface kInterface; + + /* + * kDialog + */ + Dialog kDialog; public: @@ -45,7 +153,7 @@ /* * Initialize */ - ErrorCode Initialize(); + ErrorCode Initialize(ResourceManager* pResource, InputManager* pInput); /* * Terminate @@ -53,6 +161,41 @@ void Terminate(); /* + * Activate + */ + void Activate(); + + /* + * Deactivate + */ + void Deactivate(); + + /* + * IsActive + */ + bool IsActive(); + + /* + * Load + */ + bool Load(const char* pName); + + /* + * ResetEnvironment + */ + void ResetEnvironment(); + + /* + * ResetBot + */ + void ResetBot(); + + /* + * ResetCode + */ + void ClearCode(); + + /* * Update */ void Update(float fElapsed); @@ -60,7 +203,39 @@ /* * Render */ - void Render(); + void Render(RenderContext& kContext); + +private: + + /* + * SetupVertexBuffer + */ + ErrorCode SetupVertexBuffer(); + + /* + * Render3D + */ + void Render3D(RenderContext& kContext); + + /* + * Render2D + */ + void Render2D(RenderContext& kContext); + + /* + * RenderEnvironment + */ + void RenderEnvironment(RenderContext& kContext, Environment* pEnvironment); + + /* + * RenderBot + */ + void RenderBot(RenderContext& kContext, Environment* pEnvironment, Bot* pBot); + + /* + * ProcessInput + */ + void ProcessInput(float fElapsed); }; #endif //__WORLD_H__ diff -r 968341ab1fb2 -r e494c4295dba LightClone/ToDo.txt --- a/LightClone/ToDo.txt Fri Sep 09 16:18:41 2011 -0700 +++ b/LightClone/ToDo.txt Fri Sep 09 18:36:18 2011 -0700 @@ -5,9 +5,9 @@ 5. Pause menu 6. Robot model & texture 7. Separate button images from dialog box -8. Finish level completion dialog -9. Implement game over dialog -10. Implement confirm exit dialog -11. Create textures for each button state -12. Help interface -13. Add button to clear code panes \ No newline at end of file +8. Implement confirm exit dialog +9. Create textures for each button state +10. Help interface +11. Add button to clear code panes +12. Get interface working again +13. Finish conversion to world model \ No newline at end of file