コード例 #1
0
ファイル: ObjFileParser.cpp プロジェクト: NevilX/assimp
// -------------------------------------------------------------------
//	Set a new material definition as the current material.
void ObjFileParser::getNewMaterial()
{
	m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd);
	m_DataIt = getNextWord<DataArrayIt>(m_DataIt, m_DataItEnd);
    if( m_DataIt == m_DataItEnd ) {
        return;
    }

	char *pStart = &(*m_DataIt);
	std::string strMat( pStart, *m_DataIt );
    while( m_DataIt != m_DataItEnd && isSeparator( *m_DataIt ) ) {
        ++m_DataIt;
    }
	std::map<std::string, ObjFile::Material*>::iterator it = m_pModel->m_MaterialMap.find( strMat );
	if ( it == m_pModel->m_MaterialMap.end() )
	{
		// Show a warning, if material was not found
		DefaultLogger::get()->warn("OBJ: Unsupported material requested: " + strMat);
		m_pModel->m_pCurrentMaterial = m_pModel->m_pDefaultMaterial;
	}
	else
	{
		// Set new material
		if ( needsNewMesh( strMat ) )
		{
			createMesh();	
		}
		m_pModel->m_pCurrentMesh->m_uiMaterialIndex = getMaterialIndex( strMat );
	}

	m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
コード例 #2
0
ファイル: ObjFileParser.cpp プロジェクト: macieks/uberengine
// -------------------------------------------------------------------
//	Get values for a new material description
void ObjFileParser::getMaterialDesc()
{
	// Get next data for material data
	m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd);
	if (m_DataIt == m_DataItEnd)
		return;

	char *pStart = &(*m_DataIt);
	while ( !isSeparator(*m_DataIt) && m_DataIt != m_DataItEnd )
		++m_DataIt;

	// Get name
	std::string strName(pStart, &(*m_DataIt));
	if ( strName.empty())
		return;

	// Search for material
	std::map<std::string, ObjFile::Material*>::iterator it = m_pModel->m_MaterialMap.find( strName );
	if ( it == m_pModel->m_MaterialMap.end() )
	{
		// Not found, use default material
		m_pModel->m_pCurrentMaterial = m_pModel->m_pDefaultMaterial;
	}
	else
	{
		// Found, using detected material
		m_pModel->m_pCurrentMaterial = (*it).second;
		m_pModel->m_pCurrentMesh->m_uiMaterialIndex = getMaterialIndex( strName );
	}

	// Skip rest of line
	m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
コード例 #3
0
ファイル: DipoleGeometry.cpp プロジェクト: steffen-kiess/dda
 void DipoleGeometry::dump (bool verbose, const Core::OStream& out) const {
   if (verbose)
     for (uint32_t i = 0; i < nvCount (); i++)
       out << i << " " << getGridCoordinates (i) << " " << (int) getMaterialIndex (i) << std::endl;
   out << "box = " << box () << std::endl;
   out << "matCount = " << matCount () << std::endl;
   out << "nvCount = " << nvCount () << std::endl;
   check ();
 }
コード例 #4
0
ファイル: ObjFileParser.cpp プロジェクト: RSATom/Qt
// -------------------------------------------------------------------
//  Get values for a new material description
void ObjFileParser::getMaterialDesc()
{
    // Get next data for material data
    m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd);
    if (m_DataIt == m_DataItEnd) {
        return;
    }

    char *pStart = &(*m_DataIt);
    while( m_DataIt != m_DataItEnd && !IsLineEnd( *m_DataIt ) ) {
        ++m_DataIt;
    }

    // In some cases we should ignore this 'usemtl' command, this variable helps us to do so
    bool skip = false;

    // Get name
    std::string strName(pStart, &(*m_DataIt));
    strName = trim_whitespaces(strName);
    if (strName.empty())
        skip = true;

    // If the current mesh has the same material, we simply ignore that 'usemtl' command
    // There is no need to create another object or even mesh here
    if (m_pModel->m_pCurrentMaterial && m_pModel->m_pCurrentMaterial->MaterialName == aiString(strName))
        skip = true;

    if (!skip)
    {
        // Search for material
        std::map<std::string, ObjFile::Material*>::iterator it = m_pModel->m_MaterialMap.find(strName);
        if (it == m_pModel->m_MaterialMap.end())
        {
            // Not found, use default material
            m_pModel->m_pCurrentMaterial = m_pModel->m_pDefaultMaterial;
            DefaultLogger::get()->error("OBJ: failed to locate material " + strName + ", skipping");
            strName = m_pModel->m_pDefaultMaterial->MaterialName.C_Str();
        }
        else
        {
            // Found, using detected material
            m_pModel->m_pCurrentMaterial = (*it).second;
        }

        if (needsNewMesh(strName))
            createMesh(strName);

        m_pModel->m_pCurrentMesh->m_uiMaterialIndex = getMaterialIndex(strName);
    }

    // Skip rest of line
    m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
コード例 #5
0
// -------------------------------------------------------------------
//  Get values for a new material description
void ObjFileParser::getMaterialDesc()
{
    // Each material request a new object.
    // Sometimes the object is already created (see 'o' tag by example), but it is not initialized !
    // So, we create a new object only if the current on is already initialized !
    if (m_pModel->m_pCurrent != NULL &&
        (   m_pModel->m_pCurrent->m_Meshes.size() > 1 ||
            (m_pModel->m_pCurrent->m_Meshes.size() == 1 && m_pModel->m_Meshes[m_pModel->m_pCurrent->m_Meshes[0]]->m_Faces.size() != 0)  )
        )
        m_pModel->m_pCurrent = NULL;

    // Get next data for material data
    m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd);
    if (m_DataIt == m_DataItEnd)
        return;

    char *pStart = &(*m_DataIt);
    while( m_DataIt != m_DataItEnd && !IsLineEnd( *m_DataIt ) ) {
        ++m_DataIt;
    }

    // Get name
    std::string strName(pStart, &(*m_DataIt));
    if ( strName.empty())
        return;

    // Search for material
    std::map<std::string, ObjFile::Material*>::iterator it = m_pModel->m_MaterialMap.find( strName );
    if ( it == m_pModel->m_MaterialMap.end() )
    {
        // Not found, use default material
        m_pModel->m_pCurrentMaterial = m_pModel->m_pDefaultMaterial;
        DefaultLogger::get()->error("OBJ: failed to locate material " + strName + ", skipping");
    }
    else
    {
        // Found, using detected material
        m_pModel->m_pCurrentMaterial = (*it).second;
        if ( needsNewMesh( strName ))
        {
            createMesh();
        }
        m_pModel->m_pCurrentMesh->m_uiMaterialIndex = getMaterialIndex( strName );
    }

    // Skip rest of line
    m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
コード例 #6
0
ファイル: ObjFileParser.cpp プロジェクト: RSATom/Qt
// -------------------------------------------------------------------
//  Creates a new object instance
void ObjFileParser::createObject(const std::string &objName)
{
    ai_assert( NULL != m_pModel );

    m_pModel->m_pCurrent = new ObjFile::Object;
    m_pModel->m_pCurrent->m_strObjName = objName;
    m_pModel->m_Objects.push_back( m_pModel->m_pCurrent );

    createMesh( objName  );

    if( m_pModel->m_pCurrentMaterial )
    {
        m_pModel->m_pCurrentMesh->m_uiMaterialIndex =
            getMaterialIndex( m_pModel->m_pCurrentMaterial->MaterialName.data );
        m_pModel->m_pCurrentMesh->m_pMaterial = m_pModel->m_pCurrentMaterial;
    }
}
コード例 #7
0
ファイル: ObjFileParser.cpp プロジェクト: NevilX/assimp
// -------------------------------------------------------------------
//	Returns true, if a new mesh must be created.
bool ObjFileParser::needsNewMesh( const std::string &rMaterialName )
{
	if(m_pModel->m_pCurrentMesh == 0)
	{
		// No mesh data yet
		return true;
	}
	bool newMat = false;
	int matIdx = getMaterialIndex( rMaterialName );
	int curMatIdx = m_pModel->m_pCurrentMesh->m_uiMaterialIndex;
	if ( curMatIdx != int(ObjFile::Mesh::NoMaterial) || curMatIdx != matIdx )
	{
		// New material -> only one material per mesh, so we need to create a new 
		// material
		newMat = true;
	}
	return newMat;
}
コード例 #8
0
ファイル: ObjFileParser.cpp プロジェクト: macieks/uberengine
// -------------------------------------------------------------------
//	Creates a new object instance
void ObjFileParser::createObject(const std::string &strObjectName)
{
	ai_assert (NULL != m_pModel);
	ai_assert (!strObjectName.empty());

	m_pModel->m_pCurrent = new ObjFile::Object();
	m_pModel->m_pCurrent->m_strObjName = strObjectName;
	m_pModel->m_Objects.push_back( m_pModel->m_pCurrent );
	
	m_pModel->m_pCurrentMesh = new ObjFile::Mesh();
	m_pModel->m_Meshes.push_back( m_pModel->m_pCurrentMesh );

	if( m_pModel->m_pCurrentMaterial )
	{
		m_pModel->m_pCurrentMesh->m_uiMaterialIndex = 
			getMaterialIndex( m_pModel->m_pCurrentMaterial->MaterialName.data );
		m_pModel->m_pCurrentMesh->m_pMaterial = m_pModel->m_pCurrentMaterial;
	}		
}
コード例 #9
0
ファイル: waterPlane.cpp プロジェクト: belzilep/Torque3D
void WaterPlane::innerRender( SceneRenderState *state )
{
   GFXDEBUGEVENT_SCOPE( WaterPlane_innerRender, ColorI( 255, 0, 0 ) );

   const Point3F &camPosition = state->getCameraPosition();

   Point3F rvec, fvec, uvec, pos;

   const MatrixF &objMat = getTransform(); //getRenderTransform();
   const MatrixF &camMat = state->getCameraTransform();

   MatrixF renderMat( true );

   camMat.getColumn( 1, &fvec );
   uvec.set( 0, 0, 1 );
   rvec = mCross( fvec, uvec );
   rvec.normalize();   
   fvec = mCross( uvec, rvec );
   pos = camPosition;
   pos.z = objMat.getPosition().z;      

   renderMat.setColumn( 0, rvec );
   renderMat.setColumn( 1, fvec );
   renderMat.setColumn( 2, uvec );
   renderMat.setColumn( 3, pos );

   setRenderTransform( renderMat );

   // Setup SceneData
   SceneData sgData = setupSceneGraphInfo( state );   

   // set the material
   S32 matIdx = getMaterialIndex( camPosition );
   
   if ( !initMaterial( matIdx ) )
      return;

   BaseMatInstance *mat = mMatInstances[matIdx];
   WaterMatParams matParams = mMatParamHandles[matIdx];

   // render the geometry
   if ( mat )
   {      
      // setup proj/world transform
      mMatrixSet->restoreSceneViewProjection();
      mMatrixSet->setWorld(getRenderTransform());

      setShaderParams( state, mat, matParams );     

      while( mat->setupPass( state, sgData ) )
      {    
         mat->setSceneInfo(state, sgData);
         mat->setTransforms(*mMatrixSet, state, sgData);
         setCustomTextures( matIdx, mat->getCurPass(), matParams );

         // set vert/prim buffer
         GFX->setVertexBuffer( mVertBuff );
         GFX->setPrimitiveBuffer( mPrimBuff );
         GFX->drawIndexedPrimitive( GFXTriangleList, 0, 0, mVertCount, 0, mPrimCount );
      }
   }
}