Пример #1
0
        static unsafe public Dictionary <string, string> GetExtendedStringData(granny_variant extendedVariant)
        {
            Dictionary <string, string> hashtable = new Dictionary <string, string>();

            granny_data_type_definition[] extendedDataDef = new granny_data_type_definition[3];
            extendedDataDef[0]            = new granny_data_type_definition();
            extendedDataDef[1]            = new granny_data_type_definition();
            extendedDataDef[2]            = new granny_data_type_definition();
            extendedDataDef[0].memberType = granny_member_type.GrannyStringMember;
            extendedDataDef[1].memberType = granny_member_type.GrannyStringMember;
            extendedDataDef[2].memberType = granny_member_type.GrannyEndMember;

            int i = 0;

            while (true)
            {
                if (extendedVariant.Type[i].memberType == granny_member_type.GrannyEndMember)
                {
                    break;
                }
                if (extendedVariant.Type[i].memberType == granny_member_type.GrannyStringMember)
                {
                    IntPtr p        = new IntPtr((void *)extendedVariant.Type[i].Name);
                    string typename = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(p);

                    hashtable[typename] = "";

                    string name  = typename;
                    string value = typename;

                    System.Text.ASCIIEncoding aenc = new System.Text.ASCIIEncoding();
                    byte[] name0 = aenc.GetBytes(name);
                    byte[] name1 = aenc.GetBytes(value);

                    fixed(byte *nPtr = name0)
                    {
                        fixed(byte *vPtr = name1)
                        {
                            extendedDataDef[0].Name = (char *)nPtr;
                            extendedDataDef[1].Name = (char *)vPtr;

                            BRenderEffectParamExtendedData extendedData = new BRenderEffectParamExtendedData();

                            fixed(granny_data_type_definition *dd = extendedDataDef)
                            GrannyConvertSingleObject(extendedVariant.Type, extendedVariant.Object, dd, ref extendedData);

                            if ((extendedData.paramName == null) || (extendedData.paramValue == null))
                            {
                                break;
                            }

                            p = new IntPtr((void *)extendedData.paramValue);
                            string valstring = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(p);

                            hashtable[typename] = valstring;
                        }
                    }
                }
                i++;
            }
            return(hashtable);
        }
Пример #2
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);
        }