Historique des modifications - Message

Message #7205

Sujet: texture qui se deforme lors d'un scale du mesh.


TypeDateAuteurContenu
Création du message19-10-2009 14:36:22nico
Salut tmyke, j'ai suivi ta procédure et non seulement ça résoud mon problème, mais en plus il est possible que je ne gaspille pas de ressources puisques il y a plusieurs façons de copier un imesh.
cependant je ne comprend pas tout à fait ce qui se passe mais tu pourra sans doute m'éclairer.
voici ce que je trouvé dans la classe IMeshManipulator :

Code c++ :


virtual IMesh *  createMeshUniquePrimitives (IMesh *mesh) const =0 
//  Creates a copy of a mesh with all vertices unwelded. 
 
virtual IMesh *  createMeshWelded (IMesh *mesh, f32 tolerance=core::ROUNDING_ERROR_32) const =0 
//  Creates a copy of a mesh with vertices welded. 
 
virtual IMesh *  createMeshWith2TCoords (IMesh *mesh) const =0 
//  Creates a copy of the mesh, which will only consist of S3DVertex2TCoord vertices. 
 
virtual IMesh *  createMeshWithTangents (IMesh *mesh, bool recalculateNormals=false, bool smooth=false, bool angleWeighted=false) const =0 
//  Creates a copy of the mesh, which will only consist of S3DVertexTangents vertices.  

Voilà j'ai choisi au pif createMeshWith2TCoords, cependant je ne comprend pas ce qui se passe en mémoire quand je fait
imesh* cube1= directeurDeScene->getMeshManipulator()->createMeshWith2TCoords(modele->getMesh(0));
est-ce que il y toujours quelques pointeurs vers le modele ? ou alors ça alloue un nouvel espace pour stocker toutes les propopriété du nouvel imesh ?
enfin en tout cas merci, ça faisait un moment que je bloquais quand mêmeyikes

Aussinon pour en revenir à mon problème de départ pour faire répéter la texture au lieu qu'elle s'etire lors d'un scale, j'ai modifié encore une fois au pifwinkla fonction makeplanartexturemapping
pour qu'elle prenne en paramètre le scale de mes mesh. mais j'ai un doute.

Code c++ :


void TextureMapping(scene::IMesh* mesh,int x,int y,int z, f32 resolution=0.01f)
{
	if (!mesh)
		return;

	const u32 bcount = mesh->getMeshBufferCount();

	for ( u32 b=0; b<bcount; ++b)
	{
		IMeshBuffer* buffer = mesh->getMeshBuffer(b);
		u32 idxcnt = buffer->getIndexCount();
		u16* idx = buffer->getIndices();

		for (u32 i=0; i<idxcnt; i+=3)
		{
			core::plane3df p(buffer->getPosition(idx[i+0]), buffer->getPosition(idx[i+1]), buffer->getPosition(idx[i+2]));
			p.Normal.X = fabsf(p.Normal.X)*x;
			p.Normal.Y = fabsf(p.Normal.Y)*y;
			p.Normal.Z = fabsf(p.Normal.Z)*z;

			// calculate planar mapping worldspace coordinates

			if (p.Normal.X > p.Normal.Y && p.Normal.X > p.Normal.Z)
			{
				for (u32 o=0; o!=3; ++o)
				{
					buffer->getTCoords(idx[i+o]).X = buffer->getPosition(idx[i+o]).Y * resolution*y;
					buffer->getTCoords(idx[i+o]).Y = buffer->getPosition(idx[i+o]).Z * resolution*z;
				}
			}
			else if (p.Normal.Y > p.Normal.X && p.Normal.Y > p.Normal.Z)
			{
				for (u32 o=0; o!=3; ++o)
				{
					buffer->getTCoords(idx[i+o]).X = buffer->getPosition(idx[i+o]).X * resolution*x;
					buffer->getTCoords(idx[i+o]).Y = buffer->getPosition(idx[i+o]).Z * resolution*z;
				}
			}
			else if (p.Normal.Z > p.Normal.X && p.Normal.Z > p.Normal.Y)
			{
				for (u32 o=0; o!=3; ++o)
				{

					buffer->getTCoords(idx[i+o]).X = buffer->getPosition(idx[i+o]).X * resolution*x;
					buffer->getTCoords(idx[i+o]).Y = buffer->getPosition(idx[i+o]).Y * resolution*y;
				}
			}

	}}

}
Voilà, c'est tellement couillon que je me dit qu'il doit y avoir une raison de cette absence de fonctionnalité, et donc j'ai peur de faire des bêtises. qu'en penses-tu ?

Retour

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
80 invités en ligne
membre en ligne: -
RSS Feed