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. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to