[2.1] "Renderable needs at least 2 coordinates in UV set #"

Problems building or running the engine, queries about how to use features etc.
Post Reply
User avatar
Kohedlo
Orc
Posts: 435
Joined: Fri Nov 27, 2009 3:34 pm
Location: Ukraine, Sumy
x 32
Contact:

[2.1] "Renderable needs at least 2 coordinates in UV set #"

Post by Kohedlo »

After applyig atandart datablock go error:

Code: Select all

OGRE_EXCEPT( Exception::ERR_INVALID_STATE,
                             "Renderable needs at least 2 coordinates in UV set #" +
                             StringConverter::toString( uvSource ) +
                             ". Either change the mesh, or change the UV source settings",
                             "HlmsPbs::calculateHashForPreCreate" );
            }

placed in:

Code: Select all

    void HlmsPbs::calculateHashForPreCreate( Renderable *renderable, PiecesMap *inOutPieces )
    {
        assert( dynamic_cast<HlmsPbsDatablock*>( renderable->getDatablock() ) );
        HlmsPbsDatablock *datablock = static_cast<HlmsPbsDatablock*>(
                                                        renderable->getDatablock() );

        const bool metallicWorkflow = datablock->getWorkflow() == HlmsPbsDatablock::MetallicWorkflow;
        const bool fresnelWorkflow = datablock->getWorkflow() ==
                                                        HlmsPbsDatablock::SpecularAsFresnelWorkflow;

        setProperty( PbsProperty::FresnelScalar, datablock->hasSeparateFresnel() || metallicWorkflow );
        setProperty( PbsProperty::FresnelWorkflow, fresnelWorkflow );
        setProperty( PbsProperty::MetallicWorkflow, metallicWorkflow );

        uint32 brdf = datablock->getBrdf();
        if( (brdf & PbsBrdf::BRDF_MASK) == PbsBrdf::Default )
        {
            setProperty( PbsProperty::BrdfDefault, 1 );

            if( !(brdf & PbsBrdf::FLAG_UNCORRELATED) )
                setProperty( PbsProperty::GgxHeightCorrelated, 1 );
        }
        else if( (brdf & PbsBrdf::BRDF_MASK) == PbsBrdf::CookTorrance )
            setProperty( PbsProperty::BrdfCookTorrance, 1 );

        if( brdf & PbsBrdf::FLAG_SPERATE_DIFFUSE_FRESNEL )
            setProperty( PbsProperty::FresnelSeparateDiffuse, 1 );

        for( size_t i=0; i<PBSM_REFLECTION; ++i )
        {
            uint8 uvSource = datablock->mUvSource[i];
            setProperty( *PbsProperty::UvSourcePtrs[i], uvSource );

            if( !datablock->getTexture( i ).isNull() &&
                getProperty( *HlmsBaseProp::UvCountPtrs[uvSource] ) < 2 )
            {
                OGRE_EXCEPT( Exception::ERR_INVALID_STATE,
                             "Renderable needs at least 2 coordinates in UV set #" +
                             StringConverter::toString( uvSource ) +
                             ". Either change the mesh, or change the UV source settings",
                             "HlmsPbs::calculateHashForPreCreate" );
            }
        }
Hydrax port mesh use next:

Code: Select all

void Mesh::_createGeometry()
	{
		
		int& Complexity = mOptions.MeshComplexity;

		//HydraxLOG("mOptions.MeshComplexity "+	Ogre::StringConverter::toString(mOptions.MeshComplexity));
		int numVertices = Complexity*Complexity;
		int numEle = 6 * (Complexity-1)*(Complexity-1);

		// Vertex buffers
		mSubMesh->vertexData[0] = new Ogre::v1::VertexData();
		mSubMesh->vertexData[0]->vertexStart = 0;
		mSubMesh->vertexData[0]->vertexCount = numVertices;

		//HydraxLOG("2 ");
		Ogre::v1::VertexDeclaration* vdecl = mSubMesh->vertexData[0]->vertexDeclaration;
		Ogre::v1::VertexBufferBinding* vbind = mSubMesh->vertexData[0]->vertexBufferBinding;

		size_t offset = 0;

		//HydraxLOG("CG2 ");
		//HydraxLOG(Ogre::StringConverter::toString(mOptions.MeshVertexType));
		switch (mOptions.MeshVertexType)
		{
		    case VT_POS_NORM_UV:
			{
				vdecl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
		        offset += Ogre::v1::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
		        vdecl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);
		        offset += Ogre::v1::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
		        vdecl->addElement(0, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);

				mVertexBuffer = Ogre::v1::HardwareBufferManager::getSingleton().
			        createVertexBuffer(sizeof(POS_NORM_UV_VERTEX),
			                           numVertices,
			                           Ogre::v1::HardwareBuffer::HBU_DYNAMIC);
			}
			break;

			case VT_POS_NORM:
			{
				vdecl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
		        offset += Ogre::v1::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
		        vdecl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);

				mVertexBuffer = Ogre::v1::HardwareBufferManager::getSingleton().
			        createVertexBuffer(sizeof(POS_NORM_VERTEX),
			                           numVertices,
			                           Ogre::v1::HardwareBuffer::HBU_DYNAMIC);
			}
			break;

			case VT_POS_UV:
			{
				
				vdecl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
		        offset += Ogre::v1::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
		        vdecl->addElement(0, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);

				mVertexBuffer = Ogre::v1::HardwareBufferManager::getSingleton().
			        createVertexBuffer(sizeof(POS_UV_VERTEX),
			                           numVertices,
			                           Ogre::v1::HardwareBuffer::HBU_DYNAMIC);
			}
			break;

			case VT_POS:
			{
			//	HydraxLOG("CG2 33333333333 ");
				vdecl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
//HydraxLOG("CG2 33333333333 ");
				mVertexBuffer = Ogre::v1::HardwareBufferManager::getSingleton().
			        createVertexBuffer(sizeof(POS_VERTEX),
			                           numVertices,
			                           Ogre::v1::HardwareBuffer::HBU_DYNAMIC);
			
		//	HydraxLOG("CG2 33333333333 ");
			}
			break;
		}
		
		//mVertexBuffer->unlock();

		//HydraxLOG("CG25 ");
		//HydraxLOG("3 ");

		vbind->setBinding(0, mVertexBuffer);
//HydraxLOG("4 ");
		unsigned int *indexbuffer = new unsigned int[numEle];

		int i = 0;
		for(int v=0; v<Complexity-1; v++){
			for(int u=0; u<Complexity-1; u++){
				// face 1 |/
				indexbuffer[i++] = v*Complexity + u;
				indexbuffer[i++] = v*Complexity + u + 1;
				indexbuffer[i++] = (v+1)*Complexity + u;

				// face 2 /|
				indexbuffer[i++] = (v+1)*Complexity + u;
				indexbuffer[i++] = v*Complexity + u + 1;
				indexbuffer[i++] = (v+1)*Complexity + u + 1;
			}
		}
//HydraxLOG("5 ");
		//HydraxLOG("CG2RRRR ");
		// Prepare buffer for indices
		mIndexBuffer =
			Ogre::v1::HardwareBufferManager::getSingleton().createIndexBuffer(
			Ogre::v1::HardwareIndexBuffer::IT_32BIT,
			numEle,
			Ogre::v1::HardwareBuffer::HBU_DYNAMIC, true);

		//HydraxLOG("CG2TTTTT ");
		//mIndexBuffer->unlock();
//HydraxLOG("6 ");
		mIndexBuffer->
			writeData(0,
			          mIndexBuffer->getSizeInBytes(),
			          indexbuffer,
			          true);
//HydraxLOG("61 ");
		//HydraxLOG("CG2RRRRRRRRRRRRRRRRRRRRRRRRRRRRR ");
		delete []indexbuffer;
		
//HydraxLOG("62 ");
		// Set index buffer for this submesh
		mSubMesh->indexData[0]->indexBuffer = mIndexBuffer;
//HydraxLOG("6 3");
		mSubMesh->indexData[0]->indexStart = 0;
//		HydraxLOG("6 4");
		mSubMesh->indexData[0]->indexCount = numEle;
//HydraxLOG("7 ");
		
	}
how to fix the error applying datablock,?
c++ game developer.
current project: Imperial Game Engine 2.5
Image
Post Reply