00001
00012 #ifndef GRUNAPPLICATION_H
00013 #define GRUNAPPLICATION_H
00014
00015 #include <iostream>
00016 #include <sstream>
00017
00018 #include <boost/shared_ptr.hpp>
00019 #include "util/Error.h"
00020 #include "backend/Application.h"
00021 #include "backend/RenderSystem.h"
00022 #include "System.h"
00023 #include "EntityTemplateTable.h"
00024 #include "BehaviorTemplateTable.h"
00025 #include "MessageTemplateTable.h"
00026 #include "MessagePool.h"
00027 #include "EntityPool.h"
00028 #include "util/Timer.h"
00029 #include "LibraryMessages.h"
00030 #include "LibraryBehaviors.h"
00031 #include "LibraryEntities.h"
00032 #include "parser/ProjFileParser.h"
00033
00034 namespace green
00035 {
00042 class GRunApplication : public Application
00043 {
00044 protected:
00045
00046 EntityTemplateTablePtr mEntityTemplates;
00047 BehaviorTemplateTablePtr mBehaviorTemplates;
00048 MessageTemplateTablePtr mMessageTemplates;
00049
00050 EntityPoolPtr mEntityPool;
00051 MessagePoolPtr mMsgPool;
00052
00053 SystemPtr mSys;
00054
00055 Key mDefaultEntityType;
00056 Key mKeyEventMsgType;
00057 Key mAlwaysMsgType;
00058
00059 ID mFirstEntity;
00060
00061 Timer mTimer;
00062
00067 void _InitDefaultEntity()
00068 {
00069
00070 Key bVarKey = mBehaviorTemplates->AddEntry("move", MoveBehavior::CreateTemplate());
00071
00072 Interpreter::SetMoveBehaviorKey(bVarKey);
00073
00074
00075 EntityTemplatePtr defaultEntity = DefaultEntity::CreateTemplate();
00076
00077 CHECK_SHARED(defaultEntity);
00078
00079
00080 ArgListPtr oneArg(new ArgList());
00081
00082
00083 defaultEntity->AddBehavior("move", oneArg);
00084
00085
00086 defaultEntity->SetBehaviorKey(0, bVarKey);
00087
00088
00089 mDefaultEntityType = mEntityTemplates->AddEntry("default", defaultEntity);
00090
00091
00092 std::cout << "--- BehaviorTemplateTable ---" << std::endl;
00093 mBehaviorTemplates->Print(std::cout);
00094
00095
00096 std::cout << std::endl << "--- EntityTemplateTable ---" << std::endl;
00097 mEntityTemplates->Print(std::cout);
00098 }
00099
00100 public:
00101 GRunApplication() :
00102 Application(),
00103 mEntityTemplates(new EntityTemplateTable()),
00104 mBehaviorTemplates(new BehaviorTemplateTable()),
00105 mMessageTemplates(new MessageTemplateTable()),
00106 mEntityPool(new EntityPool()),
00107 mMsgPool(new MessagePool()),
00108 mSys(new System())
00109 {
00110 mEntityTemplates->SetBehaviorTemplateTable(mBehaviorTemplates);
00111 }
00112
00114 virtual void Init()
00115 {
00116 this->_InitDefaultEntity();
00117
00118
00119 MessageTemplatePtr keyEventMsgTemplate(KeyEventMsg::CreateTemplate());
00120 CHECK_SHARED(keyEventMsgTemplate);
00121
00122 mKeyEventMsgType = mMessageTemplates->AddEntry("keyEvent", keyEventMsgTemplate);
00123
00124 MessageTemplatePtr alwaysMsgTemplate(AlwaysMsg::CreateTemplate());
00125 CHECK_SHARED(alwaysMsgTemplate);
00126
00127 mAlwaysMsgType = mMessageTemplates->AddEntry("always", alwaysMsgTemplate);
00128
00129 std::cerr << "## Message templates ##" << std::endl;
00130 mMessageTemplates->Print(std::cerr);
00131
00132
00133 ArgListPtr oneArg(new ArgList());
00134
00135
00136 EntityInstancePtr firstEntity(
00137 mEntityTemplates->Instantiate(mDefaultEntityType, oneArg));
00138
00139 CHECK_SHARED(firstEntity);
00140
00141 mEntityPool->AddInstance(firstEntity);
00142
00143 mSys->SetMessagePool(mMsgPool);
00144
00145 std::string fileName("testproj.gep");
00146 ProjFileParser::parseProject(fileName,mSys,mBehaviorTemplates,
00147 mEntityTemplates,mMessageTemplates,mEntityPool);
00148
00149 }
00150
00152 virtual void display()
00153 {
00154 ERROR_ASSERT(mRenderSystem.get(), "render system not valid");
00155 mRenderSystem->StartFrame();
00156 static bool firstFrame = true;
00157 if(firstFrame)
00158 {
00159 mTimer.StartTiming();
00160 firstFrame = false;
00161 }
00162 else
00163 mTimer.StopTiming();
00164
00165
00166 for(size_t i = 0; i < mSys->mEntities.size(); i++)
00167 {
00168 EntityInstancePtr newInstance(
00169 mEntityTemplates->Instantiate(mSys->mEntities[i].mType,
00170 mSys->mEntities[i].mArgs));
00171 CHECK_SHARED(newInstance);
00172 mEntityPool->AddInstance(newInstance);
00173 }
00174
00175
00176 for(size_t i = 0; i < mSys->mMessages.size(); i++)
00177 {
00178 std::stringstream err;
00179 err << "mSys->mMessages[" << i << "] is ";
00180 err << mSys->mMessages[i].mType << "which is not < ";
00181 err << mMessageTemplates->GetNumEntries();
00182 ERROR_ASSERT(mSys->mMessages[i].mType < mMessageTemplates->GetNumEntries(), err.str());
00183 MessageInstancePtr newMessage(MESSAGE_INSTANCE_CAST(
00184 mMessageTemplates->Instantiate(mSys->mMessages[i].mType,
00185 mSys->mMessages[i].mArgs)));
00186 CHECK_SHARED(newMessage);
00187 mMsgPool->AddMessage(mSys->mMessages[i].mTarget, newMessage);
00188 }
00189
00190
00191 MessageInstancePtr defaultMsg =
00192 AlwaysMsg::Instantiate(mAlwaysMsgType, mDefaultEntityType, mMessageTemplates);
00193
00194 ERROR_ASSERT(defaultMsg->GetTemplate() < mMessageTemplates->GetNumEntries(), "defaultMsg too high");
00195 mMsgPool->AddMessage(mDefaultEntityType, defaultMsg);
00196
00197
00198 mSys->Clear();
00199 mSys->SetTimer(mTimer);
00200
00201
00202 mEntityPool->ProcessEntities(mSys,mBehaviorTemplates);
00203
00204
00205 mEntityPool->DrawEntities(mRenderSystem);
00206
00207
00208 mMsgPool->Clear();
00209
00210 mTimer.StartTiming();
00211 mRenderSystem->FinishFrame();
00212 }
00213
00220 virtual void keyboard(unsigned char ch, int x, int y)
00221 {
00222 std::cout << "key " << ch << " down" << std::endl;
00223 KeyEventMsg keyMsg(ch, 1);
00224
00225 MessageInstancePtr newMsg(keyMsg.Instantiate(mKeyEventMsgType, mMessageTemplates));
00226 CHECK_SHARED(newMsg);
00227
00228 std::stringstream err;
00229 err << "newMsg->GetTemplate() is ";
00230 err << newMsg->GetTemplate() << "which is not < ";
00231 err << mMessageTemplates->GetNumEntries();
00232 ERROR_ASSERT(newMsg->GetTemplate() < mMessageTemplates->GetNumEntries(), err.str());
00233
00234 mMsgPool->AddMessage(mKeyEventMsgType, newMsg);
00235 }
00236
00243 virtual void keyboard_up(unsigned char ch, int x, int y)
00244 {
00245 std::cout << "key " << ch << " up" << std::endl;
00246 KeyEventMsg keyMsg(ch, 0);
00247 MessageInstancePtr newMsg(keyMsg.Instantiate(mKeyEventMsgType, mMessageTemplates));
00248
00249 CHECK_SHARED(newMsg);
00250 std::stringstream err;
00251 err << "newMsg->GetTemplate() is ";
00252 err << newMsg->GetTemplate() << "which is not < ";
00253 err << mMessageTemplates->GetNumEntries();
00254 ERROR_ASSERT(newMsg->GetTemplate() < mMessageTemplates->GetNumEntries(), err.str());
00255
00256 mMsgPool->AddMessage(mKeyEventMsgType, newMsg);
00257 }
00258
00259 };
00260 typedef boost::shared_ptr<GRunApplication> GRunApplicationPtr;
00261 }
00262 #endif