Пример #1
0
 public static extern unsafe void GrannyConvertSingleObject(granny_data_type_definition *SourceType,
                                                            void *SourceObject,
                                                            granny_data_type_definition *DestType,
                                                            ref BRenderEffectParamExtendedData DestObject);
Пример #2
0
 public static extern unsafe void GrannyCopyMeshVertices(granny_mesh *mesh, granny_data_type_definition *vertType, void *dstVertexData);
Пример #3
0
        static public unsafe bool getVertexTypeFromGranny(granny_data_type_definition *grannyVertType,
                                                          ref int vertMemSize,
                                                          ref granny_data_type_definition[] grnDTD,
                                                          ref VertexDeclaration grnVD,
                                                          ref VertexDeclaration d3dVD)
        {
            List <VertexTypes.eVertexDeclElement> decls   = new List <VertexTypes.eVertexDeclElement>();
            List <granny_data_type_definition>    grndcls = new List <granny_data_type_definition>();

            granny_data_type_definition *def = grannyVertType;

            while (def->memberType != granny_member_type.GrannyEndMember)
            {
                byte *str = (byte *)def->Name;

                IntPtr strPtr = new IntPtr((byte *)str);
                string name   = Marshal.PtrToStringAnsi(strPtr);
                if (name.Equals("FD")) //COMPRESSED VERTEX FORMAT
                {
                    // CoreGlobals.getErrorManager().OnSimpleWarning(String.Format("Granny file {0} is Compressed. The current build of the editor does not support this. \n To view this model in the editor, please re-export uncompressed.", filename));
                    return(false);
                }

                if (def->memberType == granny_member_type.GrannyReal32Member)
                {
                    granny_data_type_definition pdef;
                    pdef.ArrayWidth    = def->ArrayWidth;
                    pdef.Extra0        = def->Extra0;
                    pdef.Extra1        = def->Extra1;
                    pdef.Extra2        = def->Extra2;
                    pdef.memberType    = def->memberType;
                    pdef.Name          = def->Name;
                    pdef.ReferenceType = def->ReferenceType;
                    pdef.TraversalID   = def->TraversalID;

                    //grndcls.Add(pdef);

                    if (def->ArrayWidth == 4)
                    {
                        //  if (name.Equals("DiffuseColor0")) decls.Add(VertexTypes.eVertexDeclElement.cVDE_ColorDWORD);
                    }
                    else if (def->ArrayWidth == 3)
                    {
                        if (name.Equals("Position"))
                        {
                            decls.Add(VertexTypes.eVertexDeclElement.cVDE_Position); grndcls.Add(pdef);
                        }
                        else if (name.Equals("Normal"))
                        {
                            decls.Add(VertexTypes.eVertexDeclElement.cVDE_Normal); grndcls.Add(pdef);
                        }
                        else if (name.Equals("Tangent"))
                        {
                            decls.Add(VertexTypes.eVertexDeclElement.cVDE_Tangent); grndcls.Add(pdef);
                        }
                        else if (name.Equals("Binormal"))
                        {
                            decls.Add(VertexTypes.eVertexDeclElement.cVDE_BiNormal); grndcls.Add(pdef);
                        }
                    }
                    else if (def->ArrayWidth == 2)
                    {
                        if (name.Equals("TextureCoordinates0"))
                        {
                            decls.Add(VertexTypes.eVertexDeclElement.cVDE_TexCoord2); grndcls.Add(pdef);
                        }
                        else if (name.Equals("TextureCoordinates1"))
                        {
                            decls.Add(VertexTypes.eVertexDeclElement.cVDE_TexCoord2); grndcls.Add(pdef);
                        }
                        else if (name.Equals("TextureCoordinates2"))
                        {
                            decls.Add(VertexTypes.eVertexDeclElement.cVDE_TexCoord2); grndcls.Add(pdef);
                        }
                        else if (name.Equals("TextureCoordinates3"))
                        {
                            decls.Add(VertexTypes.eVertexDeclElement.cVDE_TexCoord2); grndcls.Add(pdef);
                        }
                    }
                }

                /* else if (def->memberType == granny_member_type.GrannyNormalUInt8Member)
                 * {
                 *
                 * //   CoreGlobals.getErrorManager().OnSimpleWarning(String.Format("Granny file {0} has an unsupported vertex structure", filename));
                 * //   return false;
                 *
                 *  if (name.Equals("BoneWeights"))
                 *  {
                 *     if (def->ArrayWidth == 4)
                 *        decls.Add(VertexTypes.eVertexDeclElement.cVDE_BlendWeight4);
                 *  }
                 *  else if (name.Equals("BoneIndices"))
                 *     decls.Add(VertexTypes.eVertexDeclElement.cVDE_BlendIndicies);
                 * }*/

                def++;
            }

            //create our granny vertex

            grnDTD = new granny_data_type_definition[grndcls.Count + 1];
            for (int k = 0; k < grndcls.Count; k++)
            {
                grnDTD[k] = grndcls[k];
            }
            grnDTD[decls.Count]            = new granny_data_type_definition();
            grnDTD[decls.Count].memberType = granny_member_type.GrannyEndMember;


            //get our D3D Version of things
            short val = 0;

            grnVD       = VertexTypes.genVertexDecl(decls, false, ref val);
            vertMemSize = (int)val;
            d3dVD       = VertexTypes.genVertexDecl(decls, true, ref val);

            return(true);
        }
Пример #4
0
        static private unsafe void processMesh(ref BRenderGrannyMesh mesh, granny_mesh *grannyMesh)
        {
            BRenderPrimitive prim = new BRenderPrimitive();

            //indicies
            prim.mNumInds = GrannyGetMeshTriangleCount(grannyMesh) * 3;
            int[] indData = new int[prim.mNumInds];

            int    indexSize          = prim.mNumInds * sizeof(int);
            IntPtr pMarshaledIndexMem = System.Runtime.InteropServices.Marshal.AllocHGlobal(indexSize);

            GrannyCopyMeshIndices(grannyMesh, 4, (int *)pMarshaledIndexMem);
            System.Runtime.InteropServices.Marshal.Copy(pMarshaledIndexMem, indData, 0, prim.mNumInds);
            System.Runtime.InteropServices.Marshal.FreeHGlobal(pMarshaledIndexMem);


            //ib's
            prim.mIB = new IndexBuffer(typeof(int), prim.mNumInds, BRenderDevice.getDevice(), Usage.None, Pool.Managed);
            GraphicsStream stream  = prim.mIB.Lock(0, 0, LockFlags.None);
            int *          outInds = (int *)stream.InternalDataPointer;

            for (int q = 0; q < prim.mNumInds; q++)
            {
                outInds[q] = indData[q];
            }

            prim.mIB.Unlock();
            stream.Close();


            //verticies
            prim.mVertexSize = 0;


            granny_data_type_definition *grnyVertTypeDef = GrannyGetMeshVertexType(grannyMesh);

            granny_data_type_definition[] grnDTD = null;
            VertexDeclaration             grnVD  = null;

            if (!getVertexTypeFromGranny(grnyVertTypeDef, ref prim.mVertexSize, ref grnDTD, ref grnVD, ref prim.mVDecl))
            {
                //already logged
                //CoreGlobals.getErrorManager().OnSimpleWarning(String.Format("Error loading {0} getVertexTypeFromGranny failed", filename));

                return;
            }

            prim.mNumVerts = GrannyGetMeshVertexCount(grannyMesh);

            {
                int    size          = prim.mNumVerts * prim.mVertexSize;
                IntPtr pMarshaledMem = System.Runtime.InteropServices.Marshal.AllocHGlobal(size);
                byte[] tGrnVerts     = new byte[size];


                fixed(granny_data_type_definition *grnPD = grnDTD)
                GrannyCopyMeshVertices(grannyMesh, grnPD /*grnyVertTypeDef*/, (void *)pMarshaledMem);

                System.Runtime.InteropServices.Marshal.Copy(pMarshaledMem, tGrnVerts, 0, size);
                System.Runtime.InteropServices.Marshal.FreeHGlobal(pMarshaledMem);

                byte[] d3dVerts = new byte[size];

                //swizzle the granny verts to be d3d friendly before copying them to the device
                swzzlGrnyVertsToD3DVerts(tGrnVerts, grnVD, prim.mVertexSize, prim.mNumVerts,
                                         ref d3dVerts, prim.mVDecl);



                prim.mVB = new VertexBuffer(BRenderDevice.getDevice(), (int)prim.mNumVerts * prim.mVertexSize, Usage.None, VertexFormats.None, Pool.Managed);
                stream   = prim.mVB.Lock(0, 0, LockFlags.None);

                stream.Write(d3dVerts, 0, size);
                prim.mVB.Unlock();
                stream.Close();


                tGrnVerts = null;
                grnVD.Dispose();
                grnVD = null;
            }
            //SUB GROUPS
            int groupCount = GrannyGetMeshTriangleGroupCount(grannyMesh);
            granny_tri_material_group *GrannyMatGroups = GrannyGetMeshTriangleGroups(grannyMesh);


            //process our material groups for this mesh


            for (int k = 0; k < groupCount; k++)
            {
                BRenderMaterialGroup group = new BRenderMaterialGroup();


                group.mStartIndex = GrannyMatGroups[k].TriFirst * 3;
                group.mPrimCount  = GrannyMatGroups[k].TriCount;

                //load your texture here.
                prim.mGroups.Add(group);
            }


            mesh.addRenderPrimitive(prim);
        }
Пример #5
0
 public static extern unsafe granny_mesh_deformer *GrannyNewMeshDeformer(granny_data_type_definition *InputVertexLayout,
                                                                         granny_data_type_definition *OutputVertexLayout,
                                                                         granny_deformation_type DeformationType,
                                                                         granny_deformer_tail_flags TailFlag);