Пример #1
0
void loadScene(char *name) {
	char line_buffer[MAX_LINE_SIZE];

	fp = fopen(name,"r");

	if(!fp) {	/* file could not be opened properly */
		fprintf(stderr,"ERROR: Scene file %s could not be loaded\n", name);
		fflush(stderr);
		exit(-1);
	}

	/* now go through all the lines in the file */
	while(fgets(line_buffer, MAX_LINE_SIZE, fp)) {	
		/* only do something if it's not a comment and the line is not blank */
		if (!lineCanBeIgnored(line_buffer)) {
			/* at this point it is neither a comment nor a blank line */
			parseScene(line_buffer);
		}
	}

	fclose(fp);


	return;
}
Пример #2
0
void ofxFBXScene::parseScene(FbxNode* pNode, FbxAnimLayer * pAnimLayer, ofxFBXNode * parentNode){
	ofLogVerbose("ofxFBXScene") << "found node " << pNode->GetName() << " of type " << pNode->GetTypeName() << endl;
    if( pNode->GetCamera() ){
    	ofxFBXNode * node = parseCameraInfo(pNode,pAnimLayer);
    	if(parentNode) node->getNode().setParent(parentNode->getNode());
    	parentNode = node;
    }else if(pNode->GetMesh()){
    	ofxFBXNode * node = parseMeshInfo(pNode, pAnimLayer);
    	if(parentNode) node->getNode().setParent(parentNode->getNode());
    	parentNode = node;
    }else if(pNode->GetLight()){
    	ofxFBXNode * node = parseLightInfo(pNode, pAnimLayer);
    	if(parentNode) node->getNode().setParent(parentNode->getNode());
    	parentNode = node;
    }else{
    	ofxFBXNode node;
    	node.nodeName = pNode->GetName();
		parsePositionCurve(node,pAnimLayer,pNode->LclTranslation);
		parseScaleCurve(node,pAnimLayer,pNode->LclScaling);
		parseRotationCurve(node,pAnimLayer,pNode,pNode->LclRotation);
		nullsList.push_back(node);
		if(parentNode) nullsList.back().getNode().setParent(parentNode->getNode());
    	parentNode = &nullsList.back();
    }

    //recursively traverse each node in the scene
    int i, lCount = pNode->GetChildCount();
    for (i = 0; i < lCount; i++)
    {
    	parseScene(pNode->GetChild(i), pAnimLayer, parentNode);
    }
}
Пример #3
0
static MeshModel* parseFile()
{
	unsigned short id;
	int            len;
	in.sgetn((char*)&id, 2);
	in.sgetn((char*)&len, 4);
	if (id != CHUNK_MAIN)
		return 0;
	chunk_end = (int)in.pubseekoff(0, std::ios_base::cur) + len - 6;

	enterChunk();
	MeshModel* root = new MeshModel();
	while (int id = nextChunk()) {
		switch (id) {
		case CHUNK_SCENE:
			parseScene(root);
			break;
		case CHUNK_KEYFRAMER:
			parseKeyFramer(root);
			break;
		}
	}
	leaveChunk();
	return root;
}
Пример #4
0
	Scene::Scene(string sceneText){
	    texture = Texture::loadTexBMP(wallTexture);

		//shapes.push_back(new Sphere(1.0,15,15, GL_POLYGON));
		num_lights = 0;
		drawRay = false;
		parseScene(sceneText);
		drawRay = 0;
	}
Пример #5
0
//Loads and checks the scenefile. then calls parseScene to parse the data.
bool SceneLoader::parseLevel(const Ogre::String &filename,const Ogre::String &group, Ogre::SceneManager *sceneMgr, Ogre::SceneNode *attachNode, PhysicsManager *physicsMgr, Ogre::Terrain* terrain)
{
	//Initialize
	mvpXMLDoc = 0;
	mvpSceneMgr = sceneMgr;
	mvpAttachNode = attachNode;
	mvpPhysicsMgr = physicsMgr;
	TiXmlElement *XMLRoot;
	mvpTerrain = terrain;
	
	try
	{
		//Strip the filename
		Ogre::String basename, path;
		//stripStr(filename, basename, path);
		
		//Fetch the resource to open

		Ogre::DataStreamPtr pStream = Ogre::ResourceGroupManager::getSingleton().openResource(filename);
		//Get the string
		Ogre::String data = pStream->getAsString();

		//Open xmldoc
		mvpXMLDoc = new TiXmlDocument();
		mvpXMLDoc->Parse(data.c_str());

		if( mvpXMLDoc->Error() )
			return false;
		else
			std::cout << filename << " open..." << std::endl;
	}
	catch (...)
	{
		delete mvpXMLDoc;
		return false;		
	}

	// Validate the File as a "Scene" file
	XMLRoot = mvpXMLDoc->RootElement();
	if( Ogre::String( XMLRoot->Value()) != "scene"  ) 
	{
		delete mvpXMLDoc;      
		return false;
	}

	// Check for passed node to attach scene
	if(attachNode == NULL)
	{
		mvpAttachNode = mvpSceneMgr->getRootSceneNode();
	}
	
	//If all is good to here we can begin processing the scene file
	parseScene(XMLRoot);

	return true;
}
Пример #6
0
bool ofxFBXScene::load(string path){
	bool lResult;

	// Prepare the FBX SDK.
	InitializeSdkObjects(lSdkManager, lScene);

	lResult = LoadScene(lSdkManager, lScene, ofToDataPath(path).c_str());


	if(!lResult){
		ofLogError("ofxFBXScene") << "An error occurred while loading the scene...";
	}else if(lScene){
		for (int i = 0; i < lScene->GetSrcObjectCount<FbxAnimStack>(); i++)
		{
			FbxAnimStack* lAnimStack = FbxCast<FbxAnimStack>(lScene->GetSrcObject<FbxAnimStack>(i));

			int l;
			int nbAnimLayers = lAnimStack->GetMemberCount<FbxAnimLayer>();


			/*for (l = 0; l < nbAnimLayers; l++)
			{*/
			if(nbAnimLayers){
				FbxAnimLayer* lAnimLayer = lAnimStack->GetMember<FbxAnimLayer>(0);

				//get root node of the fbx scene
				FbxNode* lRootNode = lScene->GetRootNode();

				parseScene(lRootNode, lAnimLayer,NULL);
			}
		}
		list<ofxFBXCamera>::iterator itCameras;
		for(itCameras=camerasList.begin();itCameras!=camerasList.end();itCameras++){
			cameras.push_back(&(*itCameras));
		}
		list<ofxFBXMesh>::iterator itMeshes;
		for(itMeshes=meshesList.begin();itMeshes!=meshesList.end();itMeshes++){
			meshes.push_back(&(*itMeshes));
		}
		list<ofxFBXNode>::iterator itNulls;
		for(itNulls=nullsList.begin();itNulls!=nullsList.end();itNulls++){
			nulls.push_back(&(*itNulls));
		}
		list<ofxFBXLight>::iterator itLights;
		for(itLights=lightsList.begin();itLights!=lightsList.end();itLights++){
			lights.push_back(&(*itLights));
		}
	}else{
		ofLogError("ofxFBXScene") << "Null scene...";
		lResult = false;
	}

	//Destroy all objects created by the FBX SDK.
	//DestroySdkObjects(lSdkManager,false);
	return lResult;
}
Пример #7
0
void Level::parseLevelFile(const Ogre::String &FileName, const Ogre::String &groupName, Ogre::SceneManager *sceneMgr, Ogre::SceneNode *AttachNode, const Ogre::String &prependNode)
{
	mGroupName = groupName;
	mSceneMgr = sceneMgr;
	mPrependNode = prependNode;

	TiXmlDocument *mXMLDoc = 0;
	TiXmlElement *mXMLRoot = 0;

	try
	{
		Ogre::String basename, path;
		Ogre::StringUtil::splitFilename(FileName, basename, path);

		Ogre::DataStreamPtr spStream = Ogre::ResourceGroupManager::getSingleton().openResource(basename,groupName);

		Ogre::String data = spStream->getAsString();

		mXMLDoc = new TiXmlDocument();
		mXMLDoc->Parse(data.c_str());

		spStream->close();
		spStream.setNull();

		mXMLRoot = mXMLDoc->RootElement();

		mAttachNode = AttachNode;


		if(!mAttachNode)
			mAttachNode = mSceneMgr->getRootSceneNode();

		parseScene(mXMLRoot);

		delete mXMLDoc;
	}
	catch(Ogre::Exception e)
	{
		Ogre::LogManager::getSingleton().logMessage("Level failed to load");
		delete mXMLDoc;
	}
}
Пример #8
0
	Scene::Scene(string sceneText){
		//shapes.push_back(new Sphere(1.0,15,15, GL_POLYGON));
		num_lights = 0;
		drawRay = false;
		parseScene(sceneText);
	}
Пример #9
0
Scene::Scene(std::istream& ins)
  :projection(NULL), view(NULL), numLights(0), shadowMapSize(windWidth*2), 
   texUnitBase(0)
{

  srand(0);//TODO SEED WITH TIME
  parseScene(ins);

  //create shadow map texture
  glGenTextures(1, &shadowMapTexture);
  glGenFramebuffersEXT(1, &FBOID);

  glGenFramebuffersEXT(1, &recordFBOID);
  glGenTextures(2, recordTexBase);

  glGenFramebuffersEXT(1, &directFBOID);
  glGenTextures(2, directTex);

  glBindTexture(GL_TEXTURE_2D, directTex[0]);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, windWidth, windHeight,
	       0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

  glBindTexture(GL_TEXTURE_2D, directTex[1]);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

  glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, windWidth, windHeight,
	       0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);

  
  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, directFBOID);
  glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
			    GL_TEXTURE_2D, directTex[0], 0);
  glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
			    GL_TEXTURE_2D, directTex[1], 0);


  glGenFramebuffersEXT(1, &splatBufFBOID);
  glGenTextures(1, &splatTex);

  glActiveTexture(texUnitEnums[0]);
  glBindTexture(GL_TEXTURE_2D_ARRAY, shadowMapTexture);

  glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP);
  glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP);

  glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, 
		  GL_COMPARE_R_TO_TEXTURE);
  std::cout << "numlights: " << numLights << std::endl;
  glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT, shadowMapSize, 
	       shadowMapSize, numLights, 0, GL_DEPTH_COMPONENT, 
	       GL_UNSIGNED_BYTE,NULL);
  
  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBOID);
  glDrawBuffer(GL_NONE);
  glReadBuffer(GL_NONE);

  
  //set up splat buffer
  glBindTexture(GL_TEXTURE_2D, splatTex);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, windWidth, windHeight,
	       0, GL_RGBA, GL_FLOAT, NULL);
  //it doesn't need a depth attachment



  //set up "color" attachment, alpha channel with be depth
  glBindTexture(GL_TEXTURE_2D, recordTexBase[0]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, recordWidth, recordHeight,
	       0, GL_RGBA, GL_FLOAT, NULL);
  
  //set up depth attachment
  glBindTexture(GL_TEXTURE_2D, recordTexBase[1]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

  glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, recordWidth, 
	       recordHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);


  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);//window buffer

  loadShadowShader();
  loadSplatShader();
  loadFinalShader();
  readCoordNormals();
  //  std::cout << "constructor completed" << std::endl;

  IMap = new float[4*recordWidth*recordHeight];
  splatBuffer = new float[4*windWidth*windHeight];

  timer.start();
  std::cout << "before warmup" <<timer.split() << std::endl;
  warmupCache(1000);//generate starting records
  std::cout << "after warmup" << timer.split() << std::endl;
}