src/engine/GRunApplication.h

Go to the documentation of this file.
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                                 // Add the behavior to the template table
00070                                 Key bVarKey = mBehaviorTemplates->AddEntry("move", MoveBehavior::CreateTemplate());
00071                                 
00072                                 Interpreter::SetMoveBehaviorKey(bVarKey);
00073                                 
00074                                 // create the default entity template
00075                                 EntityTemplatePtr defaultEntity = DefaultEntity::CreateTemplate();
00076                                 
00077                                 CHECK_SHARED(defaultEntity);
00078                                 
00079                                 // Create an ArgList to use
00080                                 ArgListPtr oneArg(new ArgList());
00081                                 
00082                                 // Now add a behavior to the template
00083                                 defaultEntity->AddBehavior("move", oneArg);
00084                                 
00085                                 // Set the key for the behavior we added
00086                                 defaultEntity->SetBehaviorKey(0, bVarKey);
00087                                 
00088                                 // add the default entity type to the entity template table
00089                                 mDefaultEntityType = mEntityTemplates->AddEntry("default", defaultEntity);
00090                                 
00091                                 // Print the BehaviorTemplateTable
00092                                 std::cout << "--- BehaviorTemplateTable ---" << std::endl;
00093                                 mBehaviorTemplates->Print(std::cout);
00094                                 
00095                                 // Print the template table now
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                                 // Add the KeyEventMsg template to mMessageTemplates
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                                 // Create an ArgList to use
00133                                 ArgListPtr oneArg(new ArgList());
00134                                 
00135                                 // Now instantiate an entity with that ArgList
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                                 // Start by checking if new entities need to be spawned from last frame
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                                 // now check if any new messages need to be processed from last frame
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                                 // Add the default message that gets sent every frame
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                                 // now clear the System
00198                                 mSys->Clear();
00199                                 mSys->SetTimer(mTimer);
00200                                 
00201                                 // Run behaviors on entities
00202                                 mEntityPool->ProcessEntities(mSys,mBehaviorTemplates);
00203                                 
00204                                 // Draw all the entities
00205                                 mEntityPool->DrawEntities(mRenderSystem);
00206                                 
00207                                 // Clear out the MessagePool for next frame
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

Generated on Fri Apr 27 10:27:37 2007 for Green Engine by  doxygen 1.5.1