bool Topic_04_NavMesh::onCreate(int a_argc, char* a_argv[]) { // initialise the Gizmos helper class Gizmos::create(); // create a world-space matrix for a camera m_cameraMatrix = glm::inverse( glm::lookAt(glm::vec3(10,10,10),glm::vec3(0,0,0), glm::vec3(0,1,0)) ); // create a perspective projection matrix with a 90 degree field-of-view and widescreen aspect ratio m_projectionMatrix = glm::perspective(glm::pi<float>() * 0.25f, DEFAULT_SCREENWIDTH/(float)DEFAULT_SCREENHEIGHT, 0.1f, 1000.0f); // set the clear colour and enable depth testing and backface culling glClearColor(0.25f,0.25f,0.25f,1); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); m_sponza = new FBXFile(); m_sponza->load("./resources/models/SponzaSimple.fbx", FBXFile::UNITS_CENTIMETER); createOpenGLBuffers(m_sponza); m_navMesh = new FBXFile(); m_navMesh->load("./resources/models/SponzaSimpleNavMesh.fbx", FBXFile::UNITS_CENTIMETER); // createOpenGLBuffers(m_navMesh); buildNavMesh(m_navMesh->getMeshByIndex(0), m_graph); unsigned int vertShader = Utility::loadShader("./resources/shaders/sponza.vert", GL_VERTEX_SHADER); unsigned int fragShader = Utility::loadShader("./resources/shaders/sponza.frag", GL_FRAGMENT_SHADER); m_shaderProgram = Utility::createProgram(vertShader, 0, 0, 0, fragShader); glDeleteShader(vertShader); glDeleteShader(fragShader); return true; }
bool NavMesh::onCreate(int a_argc, char* a_argv[]) { // initialise the Gizmos helper class Gizmos::create(); // create a world-space matrix for a camera m_cameraMatrix = glm::inverse( glm::lookAt(glm::vec3(20,20,0),glm::vec3(0,0,0), glm::vec3(0,1,0)) ); // create a perspective projection matrix with a 90 degree field-of-view and widescreen aspect ratio m_projectionMatrix = glm::perspective(glm::pi<float>() * 0.25f, DEFAULT_SCREENWIDTH/(float)DEFAULT_SCREENHEIGHT, 0.1f, 1000.0f); // set the clear colour and enable depth testing and backface culling glClearColor(0.25f,0.25f,0.25f,1); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); m_sponza = new FBXFile(); m_sponza->load("../../Build/models/SponzaSimple.fbx", FBXFile::UNITS_CENTIMETER); createOpenGLBuffers(m_sponza); m_navMesh = new FBXFile(); m_navMesh->load("../../Build/models/SponzaSimpleNavMesh.fbx", FBXFile::UNITS_CENTIMETER); // createOpenGLBuffers(m_navMesh); BuildNavMesh(m_navMesh->getMeshByIndex(0), m_Graph); unsigned int vs = Utility::loadShader("../../Build/shaders/sponza.vert", GL_VERTEX_SHADER); unsigned int fs = Utility::loadShader("../../Build/shaders/sponza.frag", GL_FRAGMENT_SHADER); m_shader = Utility::createProgram(vs,0,0,0,fs); glDeleteShader(vs); glDeleteShader(fs); count = 0; Screen = new ShaderHandle(); Screen->Load(2, "Screen.vert", "Screen.frag"); bBlueUp = new Button(glm::vec2(25 , 25), glm::vec2(50)); bBlueDown = new Button(glm::vec2(25, 100), glm::vec2(50)); bRedUp = new Button(glm::vec2(100, 25), glm::vec2(50)); bRedDown = new Button(glm::vec2(100 ,100), glm::vec2(50)); Behaviour* Seek = new SeekTarget(10,this); Behaviour* Rand = new RandomiseTarget(10); Behaviour* Within = new WithinRange(0.5f); // IF not within range THEN seek ELSE randomise target // IF not attack THEN Above Sequence* Seq = new Sequence(); Seq->addchild(Within); Seq->addchild(Rand); Selector* Root = new Selector(); Root->addchild(Seq); Root->addchild(Seek); Agenda = Root; RedSize = 3; BlueSize = 3; Red = new Team(); Blue = new Team(); int FlagCount = 3; for (int i=0;i<FlagCount;i++) { Flags.emplace_back(new Flag()); } Flags[0]->Position = glm::vec3(9, 0, 7); Flags[1]->Position = glm::vec3(0, 0, 0); Flags[2]->Position = glm::vec3(-9, 0, -7); for (int i=0;i<RedSize;++i) { Red->AddMember(); glm::vec3 NewPos; NewPos.xz = glm::circularRand(20.0f); Red->Members[i]->Position = NewPos; } for (int i=0;i<BlueSize;++i) { Blue->AddMember(); glm::vec3 NewPos; NewPos.xz = glm::circularRand(20.0f); Blue->Members[i]->Position = NewPos; Blue->Members[i]->SetTarget(Flags[0]->GetPos()); } for(int i=0;i<RedSize;++i) { Red->Members[i]->SetTarget(Flags[0]->GetPos()); Red->Members[i]->CalcEnemy(Blue->Members); Red->Members[i]->SetBehaviour(Agenda); GiveScore(m_Graph, Red->Members[i]->Position); Red->Members[i]->Position = m_Graph[0]->Position; } for (int i=0;i<BlueSize;++i) { Blue->Members[i]->SetBehaviour(Agenda); Blue->Members[i]->CalcEnemy(Red->Members); GiveScore(m_Graph, Blue->Members[i]->Position); Blue->Members[i]->Position = m_Graph[0]->Position; } TestNode = m_Graph[rand()%m_Graph.size()]; Path(glm::vec3(-9,0,-3), glm::vec3(6,0,5)); return true; }