예제 #1
0
Material* XMLReader::LoadMaterial(QXmlStreamReader &xml_reader, const QStringRef &local_path, QMap<QString, QList<Material *> > &map)
{
    Material* result;
    bool weighted_material = false;
    //First check what type of material we're supposed to load
    QXmlStreamAttributes attribs(xml_reader.attributes());
    QStringRef type = attribs.value(QString(), QString("type"));
    if(QStringRef::compare(type, QString("default")) == 0)
    {
        result = new Material();
    }
    else if(QStringRef::compare(type, QString("light")) == 0)
    {
        result = new LightMaterial();
        result->is_light_source = true;
        QStringRef intensity = attribs.value(QString(), QString("intensity"));
        if(QStringRef::compare(intensity, QString("")) != 0)
        {
            result->intensity = intensity.toFloat();
        }
    }
    else if(QStringRef::compare(type, QString("weighted")) == 0)
    {
        result = new WeightedMaterial();
        weighted_material = true;
        //weights are handled below
    }
    else
    {
        std::cout << "Could not parse the material!" << std::endl;
        return NULL;
    }

    result->name = attribs.value(QString(), QString("name")).toString();

    while(!xml_reader.isEndElement() || QStringRef::compare(xml_reader.name(), QString("material")) != 0)
    {
        xml_reader.readNext();
        QString tag(xml_reader.name().toString());
        if(QString::compare(tag, QString("baseColor")) == 0)
        {
            xml_reader.readNext();
            if(xml_reader.isCharacters())
            {
                result->base_color = ToVec3(xml_reader.text());
            }
            xml_reader.readNext();
        }
        else if(QString::compare(tag, QString("bxdf")) == 0)
        {
            //Add the Material to the map of BxDF names to Materials so that we can assign it a BxDF later
            xml_reader.readNext();
            if(xml_reader.isCharacters())
            {
                QString bxdf_name = xml_reader.text().toString();
                QList<Material*> list = map.value(bxdf_name);
                list.append(result);
                map.insert(bxdf_name, list);
                xml_reader.readNext();

            }
        }
        else if(QString::compare(tag, QString("texture")) == 0)
        {
            result->texture = LoadTextureFile(xml_reader, local_path);
        }
        else if(QString::compare(tag, QString("normalMap")) == 0)
        {
            result->normal_map = LoadTextureFile(xml_reader, local_path);
        }
        else if(QString::compare(tag, QString("weight")) == 0 && weighted_material)
        {
            xml_reader.readNext();
            float weight;
            if(xml_reader.isCharacters())
            {
                weight = xml_reader.text().toFloat();
            }
            ((WeightedMaterial*)result)->bxdf_weights.append(weight);
            xml_reader.readNext(); // add this line
        }
    }
    return result;
}
/*****************************************************
 Reads and loads data from assets.dat file into one of
 the vectors below.

 std::vector<GRAPHIC_FILE_DATA> m_assetFileData;
 std::vector<SPRITE_DATA> m_assetSpriteData;
 std::vector<MESH_DATA> m_assetMeshData;
 std::vector<SOUND_FILE_DATA> m_assetSoundData;

 Parameters in cfr begin with 1 not 0
*****************************************************/
bool CGraphics::LoadAssetFile(std::string filename){
  CLog *pLog = CLog::Instance();

  //validate asset data and add to appropriate vectors
  std::string parameter;
  std::string assetType;
  GRAPHIC_FILE_DATA   tempGraphic;
  SPRITE_DATA         tempSprite;  

  CCSVReader csv;
  csv.LoadFile(filename);

  //new stuff
  for(int i = 0; i < csv.GetTableSize(); ++i){

    if(csv.GetNumberParameters(i) > 1){
      assetType = csv.GetTerm(i, 0);

      if(assetType == "texture" && csv.GetNumberParameters(i) == 4){
        parameter = csv.GetTerm(i, 1);//fileID
        tempGraphic.fileID = atoi(parameter.c_str());
        parameter = csv.GetTerm(i, 2);//filename
        tempGraphic.filename = parameter;
        parameter = csv.GetTerm(i, 3);//description
        tempGraphic.description = parameter;
        m_assetFileData.push_back(tempGraphic);
      }

      else if(assetType == "sprite" && csv.GetNumberParameters(i) == 14 ){// && csv.GetNumberParameters(i) == 14){
        parameter = csv.GetTerm(i, 1);//spriteID
        tempSprite.spriteID = atoi(parameter.c_str());
        parameter = csv.GetTerm(i, 2);//fileID
        tempSprite.fileID = atoi(parameter.c_str());
        parameter = csv.GetTerm(i, 3);//left
        tempSprite.x = static_cast<float>(atof(parameter.c_str()));
        parameter = csv.GetTerm(i, 4);//right
        tempSprite.y = static_cast<float>(atof(parameter.c_str()));
        parameter = csv.GetTerm(i, 5);//width
        tempSprite.width = static_cast<float>(atof(parameter.c_str()));
        parameter = csv.GetTerm(i, 6);//height
        tempSprite.height = static_cast<float>(atof(parameter.c_str()));
        parameter = csv.GetTerm(i, 7);//scale
        tempSprite.scale =  static_cast<float>(atof(parameter.c_str()));
        parameter = csv.GetTerm(i, 8);//angle
        tempSprite.angle =  static_cast<float>(atof(parameter.c_str()));
        parameter = csv.GetTerm(i, 9);//alpha
        tempSprite.alpha = atoi(parameter.c_str());
        parameter = csv.GetTerm(i, 10);//total number of frames
        tempSprite.numberFrames = atoi(parameter.c_str());
        parameter = csv.GetTerm(i, 11);//framecount, starting frame
        tempSprite.frameCount = atoi(parameter.c_str());        
        parameter = csv.GetTerm(i, 12);//time between frames
        tempSprite.timeBetweenFrames = atof(parameter.c_str());// static_cast<float>(atof(parameter.c_str()));
        parameter = csv.GetTerm(i, 13);//description
        tempSprite.description = parameter;
        
        m_assetSpriteData.push_back(tempSprite);
      }
    }
  }

  //load graphics files
  for(unsigned int i = 0; i < m_assetFileData.size(); ++i){
    LoadTextureFile(m_assetFileData[i].fileID, "assets//graphics//" + m_assetFileData[i].filename);
  }

  pLog->Log("Exit loading of files");

  //load sprite information
  GRAPHIC_IMAGE gi;
  for(unsigned int i = 0; i < m_assetSpriteData.size(); ++i){
    gi.spriteID = m_assetSpriteData[i].spriteID;
    gi.fileID = m_assetSpriteData[i].fileID;
    gi.sourceX = static_cast<int>(m_assetSpriteData[i].x);
    gi.sourceY = static_cast<int>(m_assetSpriteData[i].y);
    gi.width = static_cast<int>(m_assetSpriteData[i].width);
    gi.height = static_cast<int>(m_assetSpriteData[i].height);
    gi.scale = m_assetSpriteData[i].scale;    
    gi.alpha = m_assetSpriteData[i].alpha;
    gi.angle = m_assetSpriteData[i].angle;
    gi.frameMax = m_assetSpriteData[i].numberFrames;
    gi.updateInterval = m_assetSpriteData[i].timeBetweenFrames;
    gi.frameCount = 0;
    gi.screenScale = 1.0; //added 4.8.09 by CB used in passing screen scale to render function
    
    //ensure the fileID really exists
    gi.bValid = false; //assume file is invalid
    for(unsigned int j = 0; j < m_assetFileData.size(); ++j){
      if(gi.fileID == m_assetFileData[j].fileID){
        gi.bValid = true;
        m_sprites.push_back(gi);
        break;
      }
    }
  }


  return true;
}
예제 #3
0
IMAGEFILE *iV_LoadImageFile(const char *fileName)
{
	char *pFileData, *ptr, *dot;
	unsigned int pFileSize, numImages = 0, i, tPages = 0;
	IMAGEFILE *ImageFile;
	char texFileName[PATH_MAX];

	if (!loadFile(fileName, &pFileData, &pFileSize))
	{
		debug(LOG_ERROR, "iV_LoadImageFile: failed to open %s", fileName);
		return NULL;
	}
	ptr = pFileData;
	// count lines, which is identical to number of images
	while (ptr < pFileData + pFileSize && *ptr != '\0')
	{
		numImages += (*ptr == '\n') ? 1 : 0;
		ptr++;
	}
	ImageFile = (IMAGEFILE *)malloc(sizeof(IMAGEFILE) + sizeof(IMAGEDEF) * numImages);
	ImageFile->ImageDefs = (IMAGEDEF*)(ImageFile + 1); // we allocated extra space for it
	ptr = pFileData;
	numImages = 0;
	while (ptr < pFileData + pFileSize)
	{
		int temp, retval;
		IMAGEDEF *ImageDef = &ImageFile->ImageDefs[numImages];

		retval = sscanf(ptr, "%u,%u,%u,%u,%u,%d,%d%n", &ImageDef->TPageID, &ImageDef->Tu, &ImageDef->Tv, &ImageDef->Width,
		       &ImageDef->Height, &ImageDef->XOffset, &ImageDef->YOffset, &temp);
		if (retval != 7)
		{
			break;
		}
		ptr += temp;
		numImages++;
		// Find number of texture pages to load (no gaps allowed in number series, eg use intfac0, intfac1, etc.!)
		if (ImageDef->TPageID > tPages)
		{
			tPages = ImageDef->TPageID;
		}
		while (ptr < pFileData + pFileSize && *ptr++ != '\n') {} // skip rest of line
	}

	dot = (char *)strrchr(fileName, '/');  // go to last path character
	dot++;				// skip it
	strcpy(texFileName, dot);	// make a copy
	dot = strchr(texFileName, '.');	// find extension
	*dot = '\0';			// then discard it
	// Load the texture pages.
	for (i = 0; i <= tPages; i++)
	{
		char path[PATH_MAX];

		snprintf(path, PATH_MAX, "%s%u.png", texFileName, i);
		ImageFile->TPageIDs[i] = LoadTextureFile(path);
	}
	ImageFile->NumImages = numImages;
	free(pFileData);

	return ImageFile;
}