Historique des modifications - Message

Message #7205

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


Type Date Auteur Contenu
Création du message 19-10-2009 14:36:22 nico
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ême yikes

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 pif wink la 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

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
118 invités en ligne
membre en ligne: -
RSS Feed