void OBJXGLWidget::initScene() {
            Lock l(m_modelMutex);

            // Initialize.
            m_model = new TransformGroup();

            TransformGroup *tg = new TransformGroup();
            // Add model to be shown.
            tg->addChild(m_model);

            tg->addChild(new XYZAxes(NodeDescriptor("XYZAxes"), 1, 12));
            tg->addChild(new Grid(NodeDescriptor("Grid"), 10, 1));

            m_root = tg;
        }
        void TransformGroup::accept(TransformGroupVisitor &visitor) {
            visitor.visit(this);

            // Traverse all children.
            vector<Node*>::iterator it = m_listOfChildren.begin();
            while (it != m_listOfChildren.end()) {
                Node *n = (*it++);
                TransformGroup *tg = dynamic_cast<TransformGroup*>(n);
                if (tg != NULL) {
                    tg->accept(visitor);
                }
                else {
                    // Child is not a TransformGroup.
                    visitor.visit(n);
                }
            }
        }
示例#3
0
            Node* DecoratorFactory::decorate(scenario::SCNXArchive &scnxArchive, const bool &showLaneConnectors) {
                TransformGroup *tg = new TransformGroup();

                Scenario &scenario = scnxArchive.getScenario();
                if (scnxArchive.getAerialImage() != NULL) {
                    clog << "AerialImage loaded." << endl;

                    Point3 origin(scenario.getGround().getAerialImage().getOriginX(), scenario.getGround().getAerialImage().getOriginY(), 0);
                    Point3 scaling(scenario.getGround().getAerialImage().getMeterPerPixelX(), scenario.getGround().getAerialImage().getMeterPerPixelY(), 0);

                    AerialImage *ai = new AerialImage(
                        NodeDescriptor("AerialImage"),
                        scnxArchive.getAerialImage(),
                        origin,
                        scaling,
                        static_cast<float> (scenario.getGround().getAerialImage().getRotationZ()));

                    tg->addChild(ai);
                }
                if (scnxArchive.getHeightImage() != NULL) {
                    clog << "HeightImage available but will be skipped." << endl;
/*
                    Point3 origin(scenario.getGround().getHeightImage().getOriginX(), scenario.getGround().getHeightImage().getOriginY(), 0);
                    Point3 scaling(scenario.getGround().getHeightImage().getMeterPerPixelX(), scenario.getGround().getHeightImage().getMeterPerPixelY(), 0);

                    HeightGrid *hg = new HeightGrid(NodeDescriptor("HeightGrid"), scnxArchive.getHeightImage(), origin, scaling, static_cast<float>(scenario.getGround().getHeightImage().getRotationZ()), static_cast<float>(scenario.getGround().getHeightImage().getGroundHeight()), static_cast<float>(scenario.getGround().getHeightImage().getMinimumHeight()), static_cast<float>(scenario.getGround().getHeightImage().getMaximumHeight()));
                    tg->addChild(hg);
*/
                }

                ScenarioOpenGLSceneTransformation scnOpenGL(showLaneConnectors);
                scenario.accept(scnOpenGL);

                tg->addChild(scnOpenGL.getRoot());

                // Load complex models.
                GroundBasedComplexModelLoader gbcml;
                TransformGroup *complexModels = gbcml.getGroundBasedComplexModels(scnxArchive);
                if (complexModels != NULL) {
                    tg->addChild(complexModels);
                }

                return tg;
            }
        void TransformGroup::deleteAllChildren() {
            Lock lc(m_listOfChildrenMutex);

            vector<Node*>::iterator it = m_listOfChildren.begin();
            while (it != m_listOfChildren.end()) {
                Node *n = (*it++);

                TransformGroup *tg = dynamic_cast<TransformGroup*>(n);
                if (tg != NULL) {
                    tg->deleteAllChildren();
                }
                else {
                    // Child is not a TransformGroup.

                    // Use disposal service for cleaning up.
                    core::wrapper::DisposalService::getInstance().addDisposableForRegularRemoval(n);
                }
            }

            // Clear regular node list.
            m_listOfChildren.clear();
        }
        TransformGroup* GroundBasedComplexModelLoader::getGroundBasedComplexModels(const SCNXArchive &scnxArchive) const {
            TransformGroup *complexModels = new TransformGroup();

            // Get list of all ground based complex models.
            vector<ComplexModel*> listOfComplexModels = scnxArchive.getListOfGroundBasedComplexModels();

            // Iterate over all ground based complex models and try to build a transform group.
            vector<ComplexModel*>::iterator jt = listOfComplexModels.begin();
            while (jt != listOfComplexModels.end()) {
                ComplexModel *cm = (*jt++);
                SharedPointer<istream> in = scnxArchive.getModelData(cm->getModelFile());
                if (in.isValid()) {
                    Node *model = NULL;

                    // Check model.
                    OBJXArchive *objxArchive = NULL;
                    if (cm->getModelFile().find(".objx") != string::npos) {
                        objxArchive = OBJXArchiveFactory::getInstance().getOBJXArchive(*in);
                    } else if (cm->getModelFile().find(".obj") != string::npos) {
                        objxArchive = OBJXArchiveFactory::getInstance().getOBJXArchiveFromPlainOBJFile(*in);
                    }

                    if (objxArchive != NULL) {
                        model = objxArchive->createTransformGroup(NodeDescriptor(cm->getName()));

                        if (model != NULL) {
                            clog << "OBJ model successfully opened." << endl;
                            clog << "  Translation: " << cm->getPosition().toString() << endl;
                            clog << "  Rotation: " << cm->getRotation().toString() << endl;

                            TransformGroup *complexModel = new TransformGroup();

                            // Translation.
                            Point3 translation(cm->getPosition());
                            complexModel->setTranslation(translation);

                            // TODO: Achsenprüfung!!
                            Point3 rotation(cm->getRotation().getX(), cm->getRotation().getZ(), cm->getRotation().getY());
                            complexModel->setRotation(rotation);

                            complexModel->addChild(model);

                            complexModels->addChild(complexModel);

                        } else {
                            clog << "OBJ model could not be opened." << endl;
                        }

                        OPENDAVINCI_CORE_DELETE_POINTER(objxArchive);
                    }
                }
            }

            return complexModels;
        }
示例#6
0
void createSceneGraph() {
	// Create world scene graph
	world = new TransformGroup( new Translate( 0, 0, 0 ) );
	
	TransformGroup *planet = new TransformGroup( new Translate( 0, 0, 0 ) );
	planet->addNode( new Shape3D( p ) );
	
	vector<Vector3*> vertices = *p->getVertices();
	vector<Vector3*> normals = *p->getNormals();

	float rangle = 0;	
	Vector3 axis;
	srand( 0 );
	int treeCount = 0;
	
	Vector3 closeNorm, last = Vector3( 0, 10, 100 );
	float dist = 9999;	
	for( int i = 0; i < vertices.size(); i++ ) {
		
		Vector3 up = Vector3( 0, 1, 0 );
		Vector3 *v = vertices[ i ];
		Vector3 *n = normals[ i ];
		
		float tmpDist = sqrt( pow( v->getX() - last.getX(), 2 ) + pow( v->getY() - last.getY(), 2 ) + 
						pow( v->getZ() - last.getZ(), 2 ) );
						
		if( dist > tmpDist ) {
			dist = tmpDist;
			pengLoc.setX( v->getX() );
			pengLoc.setY( v->getY() );
			pengLoc.setZ( v->getZ() );
			pengNormal.setX( n->getX() );
			pengNormal.setY( n->getY() );
			pengNormal.setZ( n->getZ() );
			pengIndice = i;
		}
		
		if( (rand() % 20) > 1 )
			continue;		
		
		float h = v->magnitude() - 100;
		
		if( h < -2.0 || h > 4.0 )
			continue;

		// Axis of rotation
		axis.cross( up, *n );
		axis.normalize();
		
		// Angle of rotation
		rangle = acos( up.dot( *n ) );

		TransformGroup *treeNode = new TransformGroup( new Translate( v->getX(), v->getY(), v->getZ() ) );
		TransformGroup *treeScale = new TransformGroup( new Scale( .2, .2, .2 ) );
		TransformGroup *treeRotate = new TransformGroup( 
											new Rotate( rad2deg(rangle), axis.getX(), 
													axis.getY(), axis.getZ() ) );
							
		treeRotate->addNode( new Shape3D( tree ) );
		treeScale->addNode( treeRotate );
		treeNode->addNode( treeScale );
	
		planet->addNode( treeNode );
		treeCount++;
	}
	
	Vector3 up = Vector3( 0, 1, 0 );
	// Axis of rotation
	axis.cross( up, pengNormal );
	axis.normalize();

	// Angle of rotation
	rangle = acos( up.dot( pengNormal ) );
	
	pengPoint = new Translate( pengLoc.getX(), pengLoc.getY(), pengLoc.getZ() );
	pengUp    = new Rotate( rad2deg( rangle ), axis.getX(), axis.getY(), axis.getZ() );
	pengFront = Vector3( axis );
	pengFrontNormal = Vector3( axis );
	
	//Vector3 face = Vector3( 1, 0, -1 );
	pengDir   = new Rotate( 100, 0, 1, 0 );

	TransformGroup *peng = new TransformGroup( pengPoint );
	TransformGroup *pengScale = new TransformGroup( new Scale( 3, 3, 3 ) );
	TransformGroup *pengRotate = new TransformGroup( pengUp  );
	TransformGroup *pengTrans = new TransformGroup( new Translate( 0, .5, 0 ) );
	TransformGroup *pengRotate2 = new TransformGroup( pengDir );	
											
	pengRotate2->addNode( new Shape3D( penguin ) );
	pengTrans->addNode( pengRotate2 );
	pengRotate->addNode( pengTrans );
	pengScale->addNode( pengRotate );
	peng->addNode( pengScale );
	
	planet->addNode( peng );
	
	printf("Tree Count: %d\n", treeCount );
	world->addNode( planet );	
}
    core::SharedPointer<core::wrapper::Image> OpenGLGrabber::getNextImage() {
        if ( (m_sharedMemory.isValid()) && (m_sharedMemory->isValid()) ) {
            m_sharedMemory->lock();

            // Render the image right before grabbing it.
            switch (m_render) {
                case  OpenGLGrabber::IN_CAR:
                    renderNextImageInCar();

                    m_FIFO_Obstacles.clear();
                break;
                case  OpenGLGrabber::CHASE_CAR:
                    renderNextImageChaseCar();

                    m_FIFO_Obstacles.clear();
                break;
                case  OpenGLGrabber::CHASE_CAR_SENSORS:
                {
                    const uint32_t size = m_FIFO_Obstacles.getSize();
                    for(uint32_t i = 0; i < size; i++) {
                        Container c = m_FIFO_Obstacles.leave();
                        if (c.getDataType() == Container::OBSTACLE) {
                            Obstacle obstacle = c.getData<Obstacle>();

                            // Check if sensor FOV-"Obstacle":
                            if (obstacle.getID() >= 9000) {
                                switch (obstacle.getState()) {
                                    case Obstacle::REMOVE:
                                    {
                                        // Remove obstacle.
                                        map<uint32_t, Node*>::iterator result = m_mapOfObstacles.find(obstacle.getID());
                                        if (result != m_mapOfObstacles.end()) {
                                            // Remove child from scene graph node.
                                            m_sensors->removeChild(result->second);

                                            // Remove entry from map.
                                            m_mapOfObstacles.erase(result);
                                        }
                                    }
                                    break;

                                    case Obstacle::UPDATE:
                                    {
                                        map<uint32_t, Node*>::iterator result = m_mapOfObstacles.find(obstacle.getID());
                                        if (result != m_mapOfObstacles.end()) {
                                            // Remove child from scene graph node.
                                            m_sensors->removeChild(result->second);

                                            // Remove entry from map.
                                            m_mapOfObstacles.erase(result);
                                        }
                                        // Update obstacle.
                                        TransformGroup *contourTG = new TransformGroup();
                                        vector<Point3> contour = obstacle.getPolygon().getVertices();
                                        // Close polygons.
                                        Point3 p = contour.at(0);
                                        contour.push_back(p);
                                        for (uint32_t k = 0; k < contour.size() - 1; k++) {
                                            Point3 A = contour.at(k); A.setZ(0.5);
                                            Point3 B = contour.at(k+1); B.setZ(0.5);

                                            contourTG->addChild(new hesperia::threeD::models::Line(NodeDescriptor(), A, B, Point3(0, 1, 0), 2));
                                        }
                                        m_mapOfObstacles[obstacle.getID()] = contourTG;

                                        m_sensors->addChild(contourTG);
                                    }
                                    break;
                                }
                            }
                        }
                    }

                    renderNextImageChaseCarSensors();
                }
                break;
            }

            // TODO Read pixels using BGRA!!!
            glReadBuffer(GL_BACK);
            glPixelStorei(GL_PACK_ALIGNMENT, 1);
            glReadPixels(0, 0, m_image->getWidth(), m_image->getHeight(), GL_BGR, GL_UNSIGNED_BYTE, m_sharedMemory->getSharedMemory());

            // Flip the image horizontally.
            m_image->flipHorizontally();

            m_sharedMemory->unlock();
        }

        return m_image;
    }
            void EnvironmentViewerGLWidget::nextContainer(Container &c) {
                if (c.getDataType() == Container::EGOSTATE) {
                    m_numberOfReceivedEgoStates++;

                    if (m_egoStateNode != NULL) {
                        Lock l(m_rootMutex);
                        EgoState egostate = c.getData<EgoState>();
                        Point3 dir(0, 0, egostate.getRotation().getAngleXY());
                        m_egoStateNode->setRotation(dir);
                        m_egoStateNode->setTranslation(egostate.getPosition());

                        Position egoPosition;
                        egoPosition.setPosition(egostate.getPosition());
                        egoPosition.setRotation(egostate.getRotation());
                        m_mapOfCurrentPositions[m_egoStateNodeDescriptor] = egoPosition;

                        if ( (m_numberOfReceivedEgoStates % 30) == 0 ) {
                            NodeDescriptor nd("EgoCar (Trace)");
                            TransformGroup *tg = m_mapOfTraceablePositions[nd];
                            if (tg != NULL) {
                                Point3 color(0, 0, 1);
                                hesperia::threeD::models::Point *p = new hesperia::threeD::models::Point(NodeDescriptor("Trace"), egostate.getPosition(), color, 5);
                                tg->addChild(p);
                            }
                        }
                    }
                }
                if (c.getDataType() == Container::CONTOUREDOBJECTS) {
                    if (m_contouredObjectsNode != NULL) {
                        Lock l(m_rootMutex);
                        ContouredObjects cos = c.getData<ContouredObjects>();
                        vector<ContouredObject> listOfContouredObjects = cos.getContouredObjects();
                        vector<ContouredObject>::iterator it = listOfContouredObjects.begin();
                        m_contouredObjectsNode->deleteAllChildren();
                        while (it != listOfContouredObjects.end()) {
                            vector<Point3> contour = (*it).getContour();
                            vector<Point3>::iterator jt = contour.begin();
                            while (jt != contour.end()) {
                                m_contouredObjectsNode->addChild(new hesperia::threeD::models::Point(NodeDescriptor("Point"), (*jt), Point3(1, 0, 0), 2));
                                jt++;
                            }
                            it++;
                        }
                    }
                }
                if (c.getDataType() == Container::ROUTE) {
                    if (m_plannedRoute != NULL) {
                        Lock l(m_rootMutex);
                        Route r = c.getData<Route>();
                        vector<Point3> listOfVertices = r.getListOfPoints();
                        const uint32_t SIZE = listOfVertices.size();
                        if (SIZE > 0) {
                            m_plannedRoute->deleteAllChildren();
                            for (uint32_t i = 0; i < SIZE - 1; i++) {
                                Point3 posA = listOfVertices.at(i);
                                posA.setZ(0.05);

                                Point3 posB = listOfVertices.at(i+1);
                                posB.setZ(0.05);

                                m_plannedRoute->addChild(new hesperia::threeD::models::Line(NodeDescriptor(), posA, posB, Point3(0, 1, 0), 6));
                            }
                        }
                    }
                }
                if (c.getDataType() == Container::DRAW_LINE) {
                    if (m_lines != NULL) {
                        Lock l(m_rootMutex);
                        hesperia::data::environment::Line line = c.getData<Line>();

                        Point3 posA = line.getA();
                        posA.setZ(0.05);

                        Point3 posB = line.getB();
                        posB.setZ(0.05);

                        m_lines->addChild(new hesperia::threeD::models::Line(NodeDescriptor(), posA, posB, Point3(1, 0, 0), 6));
                    }
                }
                if (c.getDataType() == Container::OBSTACLE) {
                    if (m_obstaclesRoot != NULL) {
                        Lock l(m_rootMutex);
                        Obstacle obstacle = c.getData<Obstacle>();
                        switch (obstacle.getState()) {
                            case Obstacle::REMOVE:
                            {
                                // Remove obstacle.
                                map<uint32_t, Node*>::iterator result = m_mapOfObstacles.find(obstacle.getID());
                                if (result != m_mapOfObstacles.end()) {
                                    // Remove child from scene graph node.
                                    m_obstaclesRoot->removeChild(result->second);

                                    // Remove entry from map.
                                    m_mapOfObstacles.erase(result);
                                }
                            }
                            break;

                            case Obstacle::UPDATE:
                            {
                                map<uint32_t, Node*>::iterator result = m_mapOfObstacles.find(obstacle.getID());
                                if (result != m_mapOfObstacles.end()) {
                                    // Remove child from scene graph node.
                                    m_obstaclesRoot->removeChild(result->second);

                                    // Remove entry from map.
                                    m_mapOfObstacles.erase(result);
                                }
                                // Update obstacle.
                                TransformGroup *contourTG = new TransformGroup();
                                vector<Point3> contour = obstacle.getPolygon().getVertices();
                                // Close polygons.
                                Point3 p = contour.at(0);
                                contour.push_back(p);
                                for (uint32_t k = 0; k < contour.size() - 1; k++) {
                                    Point3 A = contour.at(k); A.setZ(0.5);
                                    Point3 B = contour.at(k+1); B.setZ(0.5);

                                    contourTG->addChild(new hesperia::threeD::models::Line(NodeDescriptor(), A, B, Point3(0, 1, 0), 2));
                                }
                                m_mapOfObstacles[obstacle.getID()] = contourTG;
                                m_obstaclesRoot->addChild(contourTG);
                            }
                            break;
                        }
                    }
                }
            }
bool PraetoriansTerrainWater::loadPackedMedia(const char* path)
{
  unsigned int signature;
  unsigned short chunkid;
  unsigned int chunklength;
  unsigned int texturescount;///use one in this version
  unsigned int watercount;
  unsigned int vertexcount;
  unsigned int indexcount;
  
  Tuple3f* vertices;
  unsigned short* indices;
  Tuple4ub* colors;
  Tuple2f* txcoords;
  ArchivedFile* file;
  WaterDatabase* wdatabase;
  
  if (!(file = FileSystem::checkOut(path)))
    return Logger::writeErrorLog(String("Could not load -> ") + path);
    
  wdatabase = Gateway::getWaterDatabase();
  
  file->read(&signature, 4);
  
  file->read(&chunkid, 2);
  file->read(&chunklength, 4);
  file->read(&texturescount, 4);
  for (unsigned int i = 0; i < texturescount; i++)
    file->seek((256 * 256 * 4) + 6, SEEKD);
    
  file->read(&watercount, 4);
  for (unsigned int i = 0; i < watercount; i++)
  {
    file->read(&chunkid, 2);
    file->read(&chunklength, 4);
    file->seek(48, SEEKD);
    file->read(&vertexcount, 4);
    
    vertices = new Tuple3f[vertexcount];
    colors = new Tuple4ub[vertexcount];
    txcoords = new Tuple2f[vertexcount];
    for (unsigned int j = 0; j < vertexcount; j++)
    {
      file->read(vertices[j], 12);
      Swap(vertices[j].x, vertices[j].z);
      file->read(colors[j], 4);
      Swap(colors[j].x, colors[j].z);
      file->read(txcoords[j], 8);
    }
    
    file->read(&indexcount, 4);
    indices = new unsigned short[indexcount];
    file->read(indices, indexcount * 2);
    
    String watername = String("H2O_") + int(wdatabase->getWatersCount());
    Geometry* geometry;
    geometry = new Geometry(watername, indexcount, vertexcount);
    geometry->setIndices(indices, false);
    geometry->setVertices(vertices, false);
    geometry->setColors(colors, false);
    geometry->setTextureElements(txcoords, 2, false);
    geometry->computeBounds();
    
    Appearance* appearance = new Appearance();
    appearance->setBlendAttributes(BlendAttributes(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
    appearance->setTexture(0, wdatabase->getWaterTexture());
    
    Model* model = new Model();
    model->setAppearance(appearance);
    model->setGeometry(geometry);
    
    TransformGroup* group = new TransformGroup();
    group->addChild(model);
    group->updateBoundsDescriptor();
    wdatabase->addWaterModel(group);
    
    deleteArray(vertices);
    deleteArray(indices);
    deleteArray(colors);
    deleteArray(txcoords);
  }
  
  FileSystem::checkIn(file);
  
  return true;
}
bool PraetoriansTerrainWater::exportData(const char* projectName)
{
  WaterDatabase* wdatabase;
  TransformGroup* tgroup;
  TransformGroup* tgroupchild;
  Geometry* geo;
  const char* inp;
  unsigned char* colsbuf;
  Tuple3f* verts;
  Tuple4ub* colors;
  Tuple2f *txcoords;
  unsigned short* indices;
  
  unsigned int signature = 2;
  unsigned short texturechunkid = 22912;
  unsigned int texturechunklen = 262164;
  unsigned int texturecount = 1;
  
  unsigned short textureid = 22914;
  unsigned int texturelen = 262150;
  
  unsigned short waterid = 22913;
  unsigned int waterlen = 0;
  
  unsigned int watercount;
  unsigned char bullshit0 = 0;
  unsigned char bullshit01[4] = {0xF0, 0xAD, 0xBA, 0x0D};
  unsigned char bullshit1[4] = {0x00};
  unsigned int vertcount;
  unsigned int idxcount;
  Tuple4ub refcol;
  Tuple3f refvert;
  String path = Gateway::getExportPath();
  
  if (!(inp = MediaPathManager::lookUpMediaPath("water_2_1.col")))
    return Logger::writeErrorLog("Could not locate water_2_1.col");
  ifstream in(inp, ios_base::binary);
  if (!in.is_open())
    return false;
  colsbuf = (unsigned char*) Gateway::aquireGeometryMemory(256 * 256 * 4);
  in.read((char*)colsbuf, 256 * 256 * 4);
  in.close();
  
  ofstream out((path + "Mapas/" + projectName + ".H2O").getBytes(), ios_base::binary);
  
  if (!out.is_open())
    return false;
    
  out.write((char*)&signature, 4);
  out.write((char*)&texturechunkid, 2);
  out.write((char*)&texturechunklen, 4);
  out.write((char*)&texturecount, 4);
  
  out.write((char*)&textureid, 2);
  out.write((char*)&texturelen, 4);
  out.write((char*)colsbuf, 256 * 256 * 4);
  
  Gateway::releaseGeometryMemory(colsbuf);
  
  wdatabase = Gateway::getWaterDatabase();
  tgroup = wdatabase->getRootGroup();
  
  watercount = tgroup->getGroupsCount();
  out.write((char*)&watercount, 4);
  
  for (unsigned int i = 0; i < watercount; i++)
  {
    tgroupchild = tgroup->getGroup(i);
    geo = tgroupchild->getModel(0)->getGeometry();
    verts = geo->getVertices();
    colors = geo->getColors();
    txcoords = geo->getTextureCoords();
    indices = geo->getIndices();
    vertcount = geo->getVerticesCount();
    idxcount = geo->getIndicesCount();
    
    out.write((char*)&waterid, 2);
    waterlen = 52 + (vertcount*24) + 4 + (idxcount*2) + 6;
    out.write((char*)&waterlen, 4);
    
    out.write((char*)&bullshit0, 1);
    for (unsigned int j = 0; j < 7; j++)
      out.write((char*)bullshit01, 4);
    out.write((char*)bullshit01, 3);
    for (unsigned int j = 0; j < 4; j++)
      out.write((char*)bullshit1, 4);
      
    out.write((char*)&vertcount, 4);
    
    for (unsigned int j = 0; j < vertcount; j++)
    {
      refvert = verts[j];
      Swap(refvert.x, refvert.z);
      out.write((char*)&refvert, 12);
      
      refcol = colors[j];
      Swap(refcol.x, refcol.z);
      out.write((char*)&refcol, 4);
      
      out.write((char*)&txcoords[j], 8);
    }
    
    out.write((char*)&idxcount, 4);
    out.write((char*)indices, idxcount * 2);
  }
  
  out.close();
  
  return true;
}