#include "ModelContainerView.h" namespace VMAP { char* gDataDir = NULL; char* gLogFile = NULL; //========================================== ModelContainerView::ModelContainerView(const G3D::GApp::Settings& settings) : GApp(settings) { i_App = this; iCommandFileRW.setFileName(gLogFile); iCurrCmdIndex = 0; iVMapManager = new VMapManager(); iDrawLine = false; iVARAreaRef = VARArea::create(1024*1024*60); iVARAreaRef2 = VARArea::create(1024*1024*2); iInstanceId = -1; iPosSent = false; } //=================================================== ModelContainerView::~ModelContainerView(void) { Array keys = iTriVarTable.getKeys(); Array::ConstIterator i = keys.begin(); while(i != keys.end()) { VAR* var = iTriVarTable.get(*i); delete var; ++i; } } //=================================================== void ModelContainerView::cleanup() { } //=================================================== Vector3 getViewPos(const ModelContainer* mc, unsigned int pModelNr = 0) { if(mc->getNSubModel() < pModelNr) { pModelNr = mc->getNSubModel(); } const SubModel sm = mc->getSubModel(pModelNr); return (sm.getAABoxBounds().low()); } void ModelContainerView::init() { } //========================================== void fillSubModelArary(const ModelContainer* pModelContainer, const TreeNode *root, Array& array, Vector3& pLo, Vector3& pHi) { Vector3 lo = Vector3(inf(), inf(), inf()); Vector3 hi = Vector3(-inf(), -inf(), -inf()); for(int i=0; i< root->getNValues(); i++) { SubModel sm = pModelContainer->getSubModel(root->getStartPosition() + i); lo = lo.min(sm.getAABoxBounds().low()); hi = hi.max(sm.getAABoxBounds().high()); array.append(sm); } if(root->getChild((TreeNode *) &pModelContainer->getTreeNode(0), 0)) { fillSubModelArary(pModelContainer, root->getChild((TreeNode *)&pModelContainer->getTreeNode(0), 0), array, lo, hi); } if(root->getChild((TreeNode *)&pModelContainer->getTreeNode(0), 1)) { fillSubModelArary(pModelContainer, root->getChild((TreeNode *)&pModelContainer->getTreeNode(0), 1), array, lo, hi); } float dist1 = (hi -lo).magnitude(); AABox b; root->getBounds(b); float dist2 = (b.high() -b.low()).magnitude(); if(dist1 > dist2) { // error int xxx = 0; } } //========================================== void ModelContainerView::addModelContainer(const std::string& pName,const ModelContainer* pModelContainer) { // VARArea::UsageHint::WRITE_EVERY_FEW_FRAMES int offset=0; Array iIndexArray; Array iGlobArray; Array SMArray; Vector3 lo, hi; fillSubModelArary(pModelContainer, &pModelContainer->getTreeNode(0), SMArray,lo,hi); for(int i=0; i vArray; Array iArray; fillVertexAndIndexArrays(sm, vArray, iArray); for(int j=0;jgBoxArray; ArraygTriArray; int gCount1 = 0, gCount2 = 0 , gCount3 = 0, gCount4 = 0; bool myfound=false; //=================================================== void ModelContainerView::onInit() { // Called before the application loop beings. Load data here and // not in the constructor so that common exceptions will be // automatically caught. iSky = Sky::fromFile("../../data/sky/"); iSkyParameters = SkyParameters(G3D::toSeconds(11, 00, 00, AM)); iLighting = Lighting::fromSky(iSky, iSkyParameters, Color3::white()); // This simple demo has no shadowing, so make all lights unshadowed iLighting->lightArray.append(iLighting->shadowedLightArray); iLighting->shadowedLightArray.clear(); // Example debug GUI: //debugPane->addCheckBox("Use explicit checking", &explicitCheck); debugWindow->setVisible(true); toneMap->setEnabled(false); } void ModelContainerView::onGraphics(RenderDevice* rd, Array &posed3D, Array &posed2D) { Array opaque, transparent; LightingRef localLighting = toneMap->prepareLighting(iLighting); SkyParameters localSky = toneMap->prepareSkyParameters(iSkyParameters); toneMap->beginFrame(rd); rd->setProjectionAndCameraMatrix(defaultCamera); rd->setColorClearValue(Color3::black()); rd->clear(); //iSky->render(rd, localSky); // Setup lighting rd->enableLighting(); //rd->setLight(0, localLighting->lightArray[0]); //rd->setAmbientLightColor(localLighting->ambientAverage()); GLight light =GLight::directional(defaultController.pointer()->position() + defaultController.pointer()->lookVector()*2,Color3::white()); rd->setLight(0,light); rd->setColor(Color3::blue()); Array keys = iTriVarTable.getKeys(); Array::ConstIterator i = keys.begin(); while(i != keys.end()) { VAR* var = iTriVarTable.get(*i); Array indexArray = iTriIndexTable.get(*i); rd->beginIndexedPrimitives(); rd->setVertexArray(*var); rd->sendIndices(RenderDevice::LINES, indexArray); rd->endIndexedPrimitives(); ++i; } for(int i=0; i 0) { rd->setColor(Color3::red()); rd->beginIndexedPrimitives(); rd->setVertexArray(iTriDebugVar); rd->sendIndices(RenderDevice::LINES, iTriDebugArray); rd->endIndexedPrimitives(); } } //-------- if(iDrawLine) { Draw::lineSegment(LineSegment::fromTwoPoints(iPos1, iPos2), rd, iColor, 3); if(myfound) { //Draw::lineSegment(LineSegment::fromTwoPoints(p1, p2), rd, iColor, 3); //Draw::lineSegment(LineSegment::fromTwoPoints(p2, p3), rd, iColor, 3); //Draw::lineSegment(LineSegment::fromTwoPoints(p3, p1), rd, iColor, 3); Draw::sphere(Sphere(p4,0.5),rd, iColor); //Draw::sphere(Sphere(p5,0.5),rd, Color3::green()); } } // Always render the posed models passed in or the Developer Window and // other Widget features will not appear. if (posed3D.size() > 0) { Vector3 lookVector = renderDevice->getCameraToWorldMatrix().lookVector(); PosedModel::sort(posed3D, lookVector, opaque, transparent); for (int i = 0; i < opaque.size(); ++i) { opaque[i]->render(renderDevice); } for (int i = 0; i < transparent.size(); ++i) { transparent[i]->render(renderDevice); } } rd->disableLighting(); toneMap->endFrame(rd); PosedModel2D::sortAndRender(rd, posed2D); } //=================================================== void ModelContainerView::fillRenderArray(const SubModel& pSm, Array &pArray, const TreeNode* pTreeNode) { for(int i=0;igetNValues(); i++) { pArray.append(pSm.getTriangles()[i+pTreeNode->getStartPosition()]); } if(pTreeNode->getChild(pSm.getTreeNodes(), 0) != 0) { fillRenderArray(pSm, pArray, pTreeNode->getChild(pSm.getTreeNodes(), 0)); } if(pTreeNode->getChild(pSm.getTreeNodes(), 1) != 0) { fillRenderArray(pSm, pArray, pTreeNode->getChild(pSm.getTreeNodes(), 1)); } } //=================================================== void ModelContainerView::fillVertexAndIndexArrays(const SubModel& pSm, Array& vArray, Array& iArray) { Array tbarray; fillRenderArray(pSm, tbarray, &pSm.getTreeNode(0)); MeshBuilder builder; int len = tbarray.size(); int count = 0; for(int i=0;igetInstanceMapTree(pMapId); std::string dirFileName = iVMapManager->getDirFileName(pMapId); if(!mt->hasDirFile(dirFileName)) { dirFileName = iVMapManager->getDirFileName(pMapId, x, y); } showMap(mt,dirFileName); iInstanceId = pMapId; } //==================================================================== bool ModelContainerView::loadAndShowTile(int pMapId, int x, int y) { char buffer[500]; sprintf(buffer, "%s/vmaps",gDataDir); bool result = false; //if(pMapId == 1) return true; //+++ int val = iVMapManager->loadMap(buffer,(unsigned int) pMapId, x,y); if(val == VMAP_LOAD_RESULT_OK) { result = true; showMap(pMapId,x,y); } else { printf("Unable to load %s\n", buffer); } return(result); } //======================================================================= void ModelContainerView::showMap(MapTree* mt, std::string dirFileName) { if(mt->hasDirFile(dirFileName)) { FilesInDir filesInDir = mt->getDirFiles(dirFileName); if(filesInDir.getRefCount() == 1) { Array fileNames = filesInDir.getFiles(); for(int i=0; igetModelContainer(name); //if(mc->getNSubModel() == 791) { addModelContainer(name, mc); //} } } } } //======================================================================= bool ModelContainerView::loadAndShowTile(int pMapId) { char buffer[500]; sprintf(buffer, "%s/vmaps",gDataDir); bool result = false; int val = iVMapManager->loadMap(buffer, (unsigned int) pMapId,-1,-1); if(val == VMAP_LOAD_RESULT_OK) { result = true; MapTree* mt = iVMapManager->getInstanceMapTree(pMapId); std::string dirFileName = iVMapManager->getDirFileName(pMapId); iTriVarTable = Table(); iTriIndexTable = Table >(); // reset table iInstanceId = pMapId; showMap(mt,dirFileName); } return(result); } //==================================================================== void ModelContainerView::processCommand() { iDrawLine = false; if(iCurrCmdIndex < iCmdArray.size()) { bool cmdfound = false; while(!cmdfound && (iCurrCmdIndex < iCmdArray.size())) { Command c = iCmdArray[iCurrCmdIndex]; if(c.getType() == LOAD_TILE) { iPrevLoadCommands.push_back(c); if(iPosSent) { if(loadAndShowTile(c.getInt(2), c.getInt(0), c.getInt(1))) { printf("load tile mapId=%d, %d, %d\n", c.getInt(2), c.getInt(0), c.getInt(1)); } else { printf("ERROR: unable to load tile mapId= %d, %d, %d\n", c.getInt(2), c.getInt(0), c.getInt(1)); } cmdfound = true; } else { printf("ignore load tile mapId=%d, %d, %d\n", c.getInt(2), c.getInt(0), c.getInt(1)); } } else if(c.getType() == LOAD_INSTANCE) { if(loadAndShowTile(c.getInt(0))) { printf("load instance %d\n", c.getInt(0)); } cmdfound = true; } else if(c.getType() == UNLOAD_TILE) { /* iVMapManager->unloadMap(c.getInt(2), c.getInt(0), c.getInt(1)); printf("unload tile %d, %d\n", c.getInt(0), c.getInt(1)); std::string dirFileName = iVMapManager->getDirFileName(iVMapManager->getMapIdNames(c.getInt(2)).iMapGroupName.c_str(), c.getInt(0), c.getInt(1)); MapTree* mt = iVMapManager->getInstanceMapTree(c.getInt(2)); if(mt->hasDirFile(dirFileName)) { Array fileNames = mt->getDirFiles(dirFileName).getFiles(); for(int i=0; igetModelContainer(name); removeModelContainer(name, mc); } } */ } else if(c.getType() == SET_POS) { if(!iPosSent) { int count = 3; while(iPrevLoadCommands.size() > 0 && count>0) { Command lc = iPrevLoadCommands.last(); iPrevLoadCommands.pop_back(); // first time, load the last map needed if(loadAndShowTile(lc.getInt(2), lc.getInt(0), lc.getInt(1))) { printf("load tile mapid=%d, %d, %d\n", lc.getInt(2), lc.getInt(0), lc.getInt(1)); } else { printf("ERROR: unable to load tile mapid=%d, %d, %d\n", lc.getInt(2), lc.getInt(0), lc.getInt(1)); } --count; } } iPosSent = true; defaultCamera.setPosition(Vector3(c.getVector(0).x,c.getVector(0).y+3, c.getVector(0).z)); defaultController.pointer()->setPosition(Vector3(c.getVector(0).x,c.getVector(0).y+3, c.getVector(0).z)); printf("set pos to %f, %f, %f\n",c.getVector(0).x, c.getVector(0).y, c.getVector(0).z ); cmdfound = true; } else if(c.getType() == TEST_VIS) { printf("TEST line of sight\n"); iDrawLine = true; iPos1 = iVMapManager->convertPositionToInternalRep(c.getVector(0).x, c.getVector(0).y, c.getVector(0).z); iPos2 = iVMapManager->convertPositionToInternalRep(c.getVector(1).x, c.getVector(1).y, c.getVector(1).z); if(c.getInt(0) != 0) { iColor = Color3::green(); } else { iColor = Color3::red(); } cmdfound = true; /* { // draw debug-lines int count = 0; for(int i=0; ikeyPressed(GKey::fromString("l"))) { //load iCmdArray = Array(); iCommandFileRW.getNewCommands(iCmdArray); iCurrCmdIndex = 0; processCommand(); } if(ui->keyPressed(GKey::fromString("r"))) { //restart iCurrCmdIndex = 0; } if(ui->keyPressed(GKey::fromString("1"))) { //inc count1 gCount1++; } if(ui->keyPressed(GKey::fromString("h"))) { //inc count1 #if 0 i_App->defaultController.getPosition(); Vector3 pos = i_App->defaultController.getPosition(); Vector3 pos2 = convertPositionToTrinityRep(pos.x, pos.y, pos.z); //Vector3 pos3 = iVMapManager->convertPositionToInternalRep(pos2.x, pos2.y, pos2.z); //pos3 = iVMapManager->convertPositionToInternalRep(pos2.x, pos2.y, pos2.z); float hight = iVMapManager->getHeight(iInstanceId, pos2.x, pos2.y, pos2.z); printf("Hight = %f\n",hight); #endif } if(ui->keyPressed(GKey::fromString("2"))) { //dec count1 gCount1--; if(gCount1 < 0) gCount1 = 0; } if(ui->keyPressed(GKey::fromString("z"))) { //zero pos i_App->defaultCamera.setPosition(Vector3(0,0,0)); printf("set pos to 0, 0, 0\n"); } if(ui->keyPressed(GKey::fromString("c"))) { //restart if(iCurrCmdIndex > 0) { if(iCmdArray[iCurrCmdIndex-1].getType() == TEST_VIS) { Vector3 p1 = iCmdArray[iCurrCmdIndex-1].getVector(0); Vector3 p2 = iCmdArray[iCurrCmdIndex-1].getVector(1); bool result; int mapId = iCmdArray[iCurrCmdIndex-1].getInt(1); gCount3 = gCount2 = 0;// debug counter gBoxArray = Array(); result = iVMapManager->isInLineOfSight(mapId, p1.x,p1.y,p1.z,p2.x,p2.y,p2.z); printf("recalc last line of light: result = %d\n", result); } } } if(ui->keyPressed(GKey::LEFT_MOUSE)) { if( iCurrCmdIndex>0) { --iCurrCmdIndex; printf("restart last command\n"); processCommand(); } } if(ui->keyPressed(GKey::MIDDLE_MOUSE)) { processCommand(); } } //========================================== void ModelContainerView::setViewPosition(const Vector3& pPosition) { //i_App->defaultController.setPosition(pPosition); i_App->defaultCamera.setPosition(pPosition); } //========================================== //========================================== } G3D_START_AT_MAIN(); int main(int argc, char** argv) { if(argc == 3) { VMAP::gDataDir = argv[1]; VMAP::gLogFile = argv[2]; G3D::GApp::Settings settings; settings.window.width = 1024; settings.window.height = 768; //settings.useDeveloperTools = true; VMAP::ModelContainerView modelContainerView(settings); modelContainerView.run(); } else { printf("%s \n",argv[0]); } }