示例#1
0
 //--------------------------------------------------
 //--------------------------------------------------
 template <> Vector4 GetAttributeValue<Vector4>(const XML::Node* in_node, const std::string& in_attributeName, const Vector4& in_defaultValue)
 {
     for(rapidxml::xml_attribute<>* attribute = in_node->first_attribute(); attribute != nullptr; attribute = attribute->next_attribute())
     {
         if (GetName(attribute) == in_attributeName)
         {
             return ParseVector4(GetValue(attribute));
         }
     }
     
     return in_defaultValue;
 }
示例#2
0
int ParseMaterial				(std::wifstream& in)			
{
	
	ObjectMaterial::OBJECT_MATERIAL_DESC md;
	md.device = D3DShell::self()->getDevice();
	md.dc = D3DShell::self()->getDeviceContext();
	md.name = ParseLine(in);
	std::wstring buffer = L"";
	bool done = false;
	std::vector<std::streamoff> val;
	do
	{
		in >> buffer;
		if(buffer.size())
		{
				 if(buffer		== ObjImpFormat::ambient)			{ ParseVector4(in, md.ambient); }
			else if(buffer		== ObjImpFormat::diffuse)			{ ParseVector4(in, md.diffuse); }
			else if(buffer		== ObjImpFormat::specular)			{ ParseVector4(in, md.specular); }
			else if(buffer		== ObjImpFormat::specularPower)		{ ParseInteger(in, md.specualarPow); }
			else if(buffer		== ObjImpFormat::ambientTexture)	{ md.ambientTexture		= ParseLine(in); }
			else if(buffer		== ObjImpFormat::diffuseTexture)	{ md.diffuseTexture		= ParseLine(in);  }
			else if(buffer		== ObjImpFormat::specularTexture)	{ md.specularTexture	= ParseLine(in);  }
			else if(buffer		== ObjImpFormat::glowTexture)		{ md.glowTexture		= ParseLine(in);  }
			else if(buffer		== ObjImpFormat::normalTexture)		{ md.normalTexture		= ParseLine(in);  }
			else if(buffer		== ObjImpFormat::comment)			{ ParseLine(in, true); }
			else if(buffer		== ObjImpFormat::endMaterial)
			{
				done = true;

				//Return newly created material id
				return MaterialHandler::AddMaterial(md);
			}
		}
	
	} while (!done || !in.eof());

	return -1;
}	
// ------------------------------------------------------------------------------------------------
void ColladaModelFactory::ParseEffectColor(xml_node* node, const char* name, float4* out)
{
    if(node)
    {
        // get 'color' descendant
        xml_node* parentNode = FindFirstByName(node, name);
        xml_node* colorNode = FindChildByName(parentNode, "color");
        if (colorNode)
        {                
            // get 4 floats
            if (!ParseVector4(colorNode, out))
            {
                ParseError("'%s' 'color' element has fewer than required 4 floats\n", name);
            }
        }
    }
}
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
 template <> Vector4 ParseValue(const std::string& in_value)
 {
     return ParseVector4(in_value);
 }
// ------------------------------------------------------------------------------------------------
void ColladaModelFactory::GetTransform(xml_node* node, Matrix * out )
{
    Matrix rotateX,rotateY,rotateZ,translate,scale;
    rotateX.MakeIdentity();
    rotateY.MakeIdentity();
    rotateZ.MakeIdentity();
    translate.MakeIdentity();
    scale.MakeIdentity();
  

    for(xml_node* child = GetChildEle(node); child != NULL; child=GetNextEle(child))
    {
        const char * name = (const char*)child->name();
        const char * sid = GetAttributeText(child, "sid", false);
        if (!name) { continue; }
        if (!sid) { continue; }

        if(strcmp(name, "rotate")==0)
        {
            if(strcmp(sid, "rotateX")==0)
            {
                float4 temp;
                if (!ParseVector4(child, &temp))
                {
                    ParseError("Failed to parse '%s' transform (expected 4 floats)'\n", sid);
                } 
                else 
                {
                    rotateX = Matrix::CreateRotationX(temp.w);                    
                }
            }
            else if(strcmp(sid, "rotateY")==0)
            {
                float4 temp;
                if (!ParseVector4(child, &temp)) 
                {
                    ParseError("Failed to parse '%s' transform (expected 4 floats)'\n", sid);
                } 
                else 
                {
                    rotateY = Matrix::CreateRotationY(temp.w);                
                }
            }
            else if(strcmp(sid, "rotateZ")==0)
            {
                float4 temp;
                if (!ParseVector4(child, &temp)) 
                {
                    ParseError("Failed to parse '%s' transform (expected 4 floats)'\n", sid);
                } 
                else
                {
                    rotateZ = Matrix::CreateRotationZ(temp.w);                    
                }
            }
        }
        else if(strcmp(name, "translate")==0)
        {
            float3 temp;
            if (!ParseVector3(child, &temp)) 
            {
                ParseError("Failed to parse '%s' transform (expected 3 floats)'\n", name);
            } 
            else 
            {
                translate = Matrix::CreateTranslation(temp);                
            }
        }
        else if(strcmp(name, "scale")==0)
        {
            float3 temp;
            if (!ParseVector3(child, &temp)) 
            {
                ParseError("Failed to parse '%s' transform (expected 3 floats)'\n", name);
            } 
            else
            {
                scale = Matrix::CreateScale(temp);                
            }
        }
        // unhandled transform node
        else
        {
            Logger::Log(OutputMessageType::Warning, "Unexpected transform node, '%s'\n", name);
        }
    }

    Matrix tmp = scale * rotateX;
    tmp = tmp * rotateY;
    tmp = tmp * rotateZ;
    tmp = tmp * translate;
    *out = tmp;
}