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); }
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); }