[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15603] branches/apricot/source: Apricot Branch

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jul 16 15:53:39 CEST 2008


Revision: 15603
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15603
Author:   blendix
Date:     2008-07-16 15:53:39 +0200 (Wed, 16 Jul 2008)

Log Message:
-----------
Apricot Branch
==============

Fix for bug #17326: normal and tangents in the game engine
were computed different than other parts of Blender, this
makes the game engine use the same code as Blender.

Fix for part of bug #17307: normal maps not working correct
in editmode in some cases.

Fix for bug #17339: a crash on ATI cards in glTexSubImage1D
due to a mistake in the code. A patch to fix this was provided
by Yong Ch, thanks!

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c
    branches/apricot/source/blender/gpu/intern/gpu_codegen.c
    branches/apricot/source/blender/gpu/intern/gpu_extensions.c
    branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp

Modified: branches/apricot/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/apricot/source/blender/blenkernel/BKE_DerivedMesh.h	2008-07-16 13:47:03 UTC (rev 15602)
+++ branches/apricot/source/blender/blenkernel/BKE_DerivedMesh.h	2008-07-16 13:53:39 UTC (rev 15603)
@@ -483,5 +483,7 @@
 void DM_vertex_attributes_from_gpu(DerivedMesh *dm,
 	struct GPUVertexAttribs *gattribs, DMVertexAttribs *attribs);
 
+void DM_add_tangent_layer(DerivedMesh *dm);
+
 #endif
 

Modified: branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c	2008-07-16 13:47:03 UTC (rev 15602)
+++ branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c	2008-07-16 13:53:39 UTC (rev 15603)
@@ -1252,6 +1252,43 @@
 	}
 }
 
+static void *emDM_getFaceDataArray(DerivedMesh *dm, int type)
+{
+	EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+	EditMesh *em= emdm->em;
+	EditFace *efa;
+	char *data, *emdata;
+	void *datalayer;
+	int index, offset, size;
+
+	datalayer = DM_get_face_data_layer(dm, type);
+	if(datalayer)
+		return datalayer;
+
+	/* layers are store per face for editmesh, we convert to a temporary
+	 * data layer array in the derivedmesh when these are requested */
+	if(type == CD_MTFACE || type == CD_MCOL) {
+		index = CustomData_get_layer_index(&em->fdata, type);
+
+		if(index != -1) {
+			offset = em->fdata.layers[index].offset;
+			size = CustomData_sizeof(type);
+
+			DM_add_face_layer(dm, type, CD_CALLOC, NULL);
+			index = CustomData_get_layer_index(&dm->faceData, type);
+			dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
+
+			data = datalayer = DM_get_face_data_layer(dm, type);
+			for(efa=em->faces.first; efa; efa=efa->next, data+=size) {
+				emdata = CustomData_em_get(&em->fdata, efa->data, type);
+				memcpy(data, emdata, size);
+			}
+		}
+	}
+
+	return datalayer;
+}
+
 static void emDM_release(DerivedMesh *dm)
 {
 	EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
@@ -1287,6 +1324,7 @@
 	emdm->dm.copyVertArray = emDM_copyVertArray;
 	emdm->dm.copyEdgeArray = emDM_copyEdgeArray;
 	emdm->dm.copyFaceArray = emDM_copyFaceArray;
+	emdm->dm.getFaceDataArray = emDM_getFaceDataArray;
 
 	emdm->dm.foreachMappedVert = emDM_foreachMappedVert;
 	emdm->dm.foreachMappedEdge = emDM_foreachMappedEdge;
@@ -3079,7 +3117,7 @@
 
 /* ******************* GLSL ******************** */
 
-static void DM_add_tangent_layer(DerivedMesh *dm)
+void DM_add_tangent_layer(DerivedMesh *dm)
 {
 	/* mesh vars */
 	MTFace *mtface, *tf;

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-07-16 13:47:03 UTC (rev 15602)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-07-16 13:53:39 UTC (rev 15603)
@@ -965,11 +965,11 @@
 		input->textype = type;
 
 		if (type == GPU_TEX1D) {
-			input->tex = GPU_texture_create_1D(link->texturesize, link->ptr1, 1);
+			input->tex = GPU_texture_create_1D(link->texturesize, link->ptr1, 0);
 			input->textarget = GL_TEXTURE_1D;
 		}
 		else {
-			input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2, 1);
+			input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2, 0);
 			input->textarget = GL_TEXTURE_2D;
 		}
 

Modified: branches/apricot/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_extensions.c	2008-07-16 13:47:03 UTC (rev 15602)
+++ branches/apricot/source/blender/gpu/intern/gpu_extensions.c	2008-07-16 13:53:39 UTC (rev 15603)
@@ -226,14 +226,14 @@
 	return smaller_pow2(n)*2;
 }
 
-static void GPU_glTexSubImageEmpty(GLenum target, GLenum type, int x, int y, int w, int h)
+static void GPU_glTexSubImageEmpty(GLenum target, GLenum format, int x, int y, int w, int h)
 {
 	void *pixels = MEM_callocN(sizeof(char)*4*w*h, "GPUTextureEmptyPixels");
 
 	if (target == GL_TEXTURE_1D)
-		glTexSubImage1D(target, 0, x, w, GL_RGBA, type, pixels);
+		glTexSubImage1D(target, 0, x, w, format, GL_UNSIGNED_BYTE, pixels);
 	else
-		glTexSubImage2D(target, 0, x, y, w, h, GL_RGBA, type, pixels);
+		glTexSubImage2D(target, 0, x, y, w, h, format, GL_UNSIGNED_BYTE, pixels);
 	
 	MEM_freeN(pixels);
 }
@@ -294,27 +294,29 @@
 
 	if (tex->target == GL_TEXTURE_1D) {
 		glTexImage1D(tex->target, 0, tex->internalformat, tex->w, 0, format, type, 0);
+
 		if (fpixels) {
 			glTexSubImage1D(tex->target, 0, 0, tex->realw, format, type,
 				pixels? pixels: fpixels);
 
 			if (tex->w > tex->realw)
-				GPU_glTexSubImageEmpty(tex->target, type, tex->realw, 0,
+				GPU_glTexSubImageEmpty(tex->target, format, tex->realw, 0,
 					tex->w-tex->realw, 1);
 		}
 	}
 	else {
 		glTexImage2D(tex->target, 0, tex->internalformat, tex->w, tex->h, 0,
 			format, type, 0);
+
 		if (fpixels) {
 			glTexSubImage2D(tex->target, 0, 0, 0, tex->realw, tex->realh,
 				format, type, pixels? pixels: fpixels);
 
 			if (tex->w > tex->realw)
-				GPU_glTexSubImageEmpty(tex->target, type, tex->realw, 0,
+				GPU_glTexSubImageEmpty(tex->target, format, tex->realw, 0,
 					tex->w-tex->realw, tex->h);
 			if (tex->h > tex->realh)
-				GPU_glTexSubImageEmpty(tex->target, type, 0, tex->realh,
+				GPU_glTexSubImageEmpty(tex->target, format, 0, tex->realh,
 					tex->realw, tex->h-tex->realh);
 		}
 	}

Modified: branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-07-16 13:47:03 UTC (rev 15602)
+++ branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-07-16 13:53:39 UTC (rev 15603)
@@ -136,8 +136,12 @@
 #include "BKE_mesh.h"
 #include "MT_Point3.h"
 
+#include "BLI_arithb.h"
+
 extern "C" {
-	#include "BKE_customdata.h"
+#include "BKE_customdata.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_DerivedMesh.h"
 }
 
 #include "BKE_material.h" /* give_current_material */
@@ -309,7 +313,6 @@
 
 // ------------------------------------
 BL_Material* ConvertMaterial(
-	Mesh* mesh, 
 	Material *mat, 
 	MTFace* tface,  
 	const char *tfaceName,
@@ -325,7 +328,7 @@
 
 	int numchan =	-1;
 	bool validmat	= (mat!=0);
-	bool validface	= (mesh->mtface && tface);
+	bool validface	= (tface!=0);
 	
 	short type = 0;
 	if( validmat )
@@ -712,132 +715,54 @@
 }
 
 
-static void BL_ComputeTriTangentSpace(const MT_Vector3 &v1, const MT_Vector3 &v2, const MT_Vector3 &v3, 
-	const MT_Vector2 &uv1, const MT_Vector2 &uv2, const MT_Vector2 &uv3, 
-	MFace* mface, MT_Vector3 *tan1, MT_Vector3 *tan2)
-{
-		MT_Vector3 dx1(v2 - v1), dx2(v3 - v1);
-		MT_Vector2 duv1(uv2 - uv1), duv2(uv3 - uv1);
-		
-		MT_Scalar r = 1.0 / (duv1.x() * duv2.y() - duv2.x() * duv1.y());
-		duv1 *= r;
-		duv2 *= r;
-		MT_Vector3 sdir(duv2.y() * dx1 - duv1.y() * dx2);
-		MT_Vector3 tdir(duv1.x() * dx2 - duv2.x() * dx1);
-		
-		tan1[mface->v1] += sdir;
-		tan1[mface->v2] += sdir;
-		tan1[mface->v3] += sdir;
-		
-		tan2[mface->v1] += tdir;
-		tan2[mface->v2] += tdir;
-		tan2[mface->v3] += tdir;
-}
-
-static MT_Vector4*  BL_ComputeMeshTangentSpace(Mesh* mesh)
-{
-	MFace* mface = static_cast<MFace*>(mesh->mface);
-	MTFace* tface = static_cast<MTFace*>(mesh->mtface);
-
-	MT_Vector3 *tan1 = new MT_Vector3[mesh->totvert];
-	MT_Vector3 *tan2 = new MT_Vector3[mesh->totvert];
-	
-	int v;
-	for (v = 0; v < mesh->totvert; v++)
-	{
-		tan1[v] = MT_Vector3(0.0, 0.0, 0.0);
-		tan2[v] = MT_Vector3(0.0, 0.0, 0.0);
-	}
-	
-	for (int p = 0; p < mesh->totface; p++, mface++, tface++)
-	{
-		MT_Vector3 	v1(mesh->mvert[mface->v1].co),
-				v2(mesh->mvert[mface->v2].co),
-				v3(mesh->mvert[mface->v3].co);
-				
-		MT_Vector2	uv1(tface->uv[0]),
-				uv2(tface->uv[1]),
-				uv3(tface->uv[2]);
-				
-		BL_ComputeTriTangentSpace(v1, v2, v3, uv1, uv2, uv3, mface, tan1, tan2);
-		if (mface->v4)
-		{
-			MT_Vector3 v4(mesh->mvert[mface->v4].co);
-			MT_Vector2 uv4(tface->uv[3]);
-			
-			BL_ComputeTriTangentSpace(v1, v3, v4, uv1, uv3, uv4, mface, tan1, tan2);
-		}
-	}
-	
-	MT_Vector4 *tangent = new MT_Vector4[mesh->totvert];
-	for (v = 0; v < mesh->totvert; v++)
-	{
-		const MT_Vector3 no(mesh->mvert[v].no[0]/32767.0, 
-					mesh->mvert[v].no[1]/32767.0, 
-					mesh->mvert[v].no[2]/32767.0);
-		// Gram-Schmidt orthogonalize
-		MT_Vector3 t(tan1[v] - no.cross(no.cross(tan1[v])));
-		if (!MT_fuzzyZero(t))
-			t /= t.length();
-
-		tangent[v].x() = t.x();
-		tangent[v].y() = t.y();
-		tangent[v].z() = t.z();
-		// Calculate handedness
-		tangent[v].w() = no.dot(tan1[v].cross(tan2[v])) < 0.0 ? -1.0 : 1.0;
-	}
-	
-	delete [] tan1;
-	delete [] tan2;
-	
-	return tangent;
-}
-
 RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* rendertools, KX_Scene* scene, KX_BlenderSceneConverter *converter)
 {
 	RAS_MeshObject *meshobj;
-	bool	skinMesh = false;
-	
+	bool skinMesh = false;
 	int lightlayer = blenderobj->lay;
-	
-	MFace* mface = static_cast<MFace*>(mesh->mface);
-	MTFace* tface = static_cast<MTFace*>(mesh->mtface);
+
+	// Get DerivedMesh data
+	DerivedMesh *dm = CDDM_from_mesh(mesh, blenderobj);
+
+	MVert *mvert = dm->getVertArray(dm);
+	int totvert = dm->getNumVerts(dm);
+
+	MFace *mface = dm->getFaceArray(dm);
+	MTFace *tface = static_cast<MTFace*>(dm->getFaceDataArray(dm, CD_MTFACE));
+	MCol *mcol = static_cast<MCol*>(dm->getFaceDataArray(dm, CD_MCOL));
+	float (*tangent)[3] = NULL;
+	int totface = dm->getNumFaces(dm);
 	const char *tfaceName = "";
-	MCol* mmcol = mesh->mcol;
-	MT_assert(mface || mesh->totface == 0);
 
+	if(tface) {
+		DM_add_tangent_layer(dm);
+		tangent = (float(*)[3])dm->getFaceDataArray(dm, CD_TANGENT);
+	}
 
 	// Determine if we need to make a skinned mesh
-	if (mesh->dvert || mesh->key){
+	if (mesh->dvert || mesh->key) {
 		meshobj = new BL_SkinMeshObject(mesh, lightlayer);
 		skinMesh = true;
 	}
-	else {
+	else
 		meshobj = new RAS_MeshObject(mesh, lightlayer);
-	}
-	MT_Vector4 *tangent = 0;
-	if (tface)
-		tangent = BL_ComputeMeshTangentSpace(mesh);
-	
 
 	// Extract avaiable layers
 	MTF_localLayer *layers =  new MTF_localLayer[MAX_MTFACE];
-	for (int lay=0; lay<MAX_MTFACE; lay++)
-	{
+	for (int lay=0; lay<MAX_MTFACE; lay++) {
 		layers[lay].face = 0;
 		layers[lay].name = "";
 	}
 
-
 	int validLayers = 0;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list