Ejemplo n.º 1
0
    private static void SetPhong(effectFx_profile_abstractProfile_COMMONTechniquePhong phong, Vector4 diffuse)
    {
        phong.diffuse = new common_color_or_texture_type();
        var col = new common_color_or_texture_typeColor();

        col.sid            = "diffuse";
        phong.diffuse.Item = col;
        col.Values         = new double[] { diffuse.x, diffuse.y, diffuse.z, diffuse.w };

        phong.emission = new common_color_or_texture_type();
        var emissionColor = new common_color_or_texture_typeColor();

        emissionColor.sid    = "emission";
        emissionColor.Values = new double[] { 0, 0, 0, 1 };
        phong.emission.Item  = emissionColor;

        phong.ambient = new common_color_or_texture_type();
        var ambientColor = new common_color_or_texture_typeColor();

        ambientColor.sid    = "ambient";
        ambientColor.Values = new double[] { 0, 0, 0, 1 };
        phong.ambient.Item  = ambientColor;

        phong.specular = new common_color_or_texture_type();
        var specularColor = new common_color_or_texture_typeColor();

        specularColor.sid    = "specular";
        specularColor.Values = new double[] { 0.5, 0.5, 0.5, 1 };
        phong.specular.Item  = specularColor;

        phong.shininess = new common_float_or_param_type();
        var f = new common_float_or_param_typeFloat();

        f.Value = 50;
        phong.shininess.Item = f;

        phong.index_of_refraction = new common_float_or_param_type();
        var f2 = new common_float_or_param_typeFloat();

        f2.Value = 1;
        phong.index_of_refraction.Item = f2;
    }
Ejemplo n.º 2
0
        public static void AddSkinnedModelWithAnimations(ref Skin SkinChunk, ref SkeletonCTTR SkeletonChunk, ref Shader[] ShaderChunks)//, ref Animation[] AnimChunks)
        {
            List <uint> IndexList = new List <uint>();

            cachedGeoms.geometry = new geometry[SkinChunk.NumPrimGroups];
            for (int primgroups = 0; primgroups < SkinChunk.NumPrimGroups; primgroups++)
            {
                cachedGeoms.geometry[primgroups]      = new geometry();
                cachedGeoms.geometry[primgroups].id   = "geometry" + primgroups;
                cachedGeoms.geometry[primgroups].name = "geometry" + primgroups;
                mesh newMesh = new Collada141.mesh();

                newMesh.vertices                   = new vertices();
                newMesh.vertices.id                = "geometry" + primgroups + "-vertices";
                newMesh.vertices.name              = "geometry" + primgroups + "-vertices";
                newMesh.vertices.input             = new InputLocal[1];
                newMesh.vertices.input[0]          = new InputLocal();
                newMesh.vertices.input[0].semantic = "POSITION";
                newMesh.vertices.input[0].source   = "#geometry" + primgroups + "-positions";
                //newMesh.vertices.input[1] = new InputLocal();
                //newMesh.vertices.input[1].semantic = "TEXCOORD";
                //newMesh.vertices.input[1].source = "#geometry" + primgroups + "-texcoords";
                //newMesh.vertices.input[2].semantic = "COLOR";
                //newMesh.vertices.input[2].source = "#geometry0-colors";

                newMesh.source = new source[3];

                newMesh.source[0]    = new source();
                newMesh.source[0].id = "geometry" + primgroups + "-positions";
                float_array geom_positions = new float_array();
                geom_positions.id = "geometry" + primgroups + "-positions-array";
                PositionList posList = SkinChunk.GetChildren <PrimitiveGroupCTTR>()[primgroups].GetChildren <PositionList>()[0];
                geom_positions.count  = (ulong)posList.Positions.Length * 3;
                geom_positions.Values = new double[geom_positions.count];
                for (ulong i = 0; i < geom_positions.count / 3; i++)
                {
                    if (i % 3 == 0)
                    {
                        geom_positions.Values[i] = posList.Positions[i / 3].X;
                    }
                    else if (i % 3 == 1)
                    {
                        geom_positions.Values[i] = posList.Positions[i / 3].Y;
                    }
                    else
                    {
                        geom_positions.Values[i] = posList.Positions[i / 3].Z;
                    }
                }

                newMesh.source[0].Item                             = geom_positions;
                newMesh.source[0].technique_common                 = new sourceTechnique_common();
                newMesh.source[0].technique_common.accessor        = new accessor();
                newMesh.source[0].technique_common.accessor.source = "#" + geom_positions.id;
                newMesh.source[0].technique_common.accessor.count  = geom_positions.count / 3;
                newMesh.source[0].technique_common.accessor.stride = 3;
                newMesh.source[0].technique_common.accessor.param  = new param[3] {
                    new param(), new param(), new param(),
                };
                newMesh.source[0].technique_common.accessor.param[0].name = "X";
                newMesh.source[0].technique_common.accessor.param[0].type = "float";
                newMesh.source[0].technique_common.accessor.param[1].name = "Y";
                newMesh.source[0].technique_common.accessor.param[1].type = "float";
                newMesh.source[0].technique_common.accessor.param[2].name = "Z";
                newMesh.source[0].technique_common.accessor.param[2].type = "float";

                newMesh.source[1]    = new source();
                newMesh.source[1].id = "geometry" + primgroups + "-mesh-normals";
                float_array geom_normals = new float_array();
                geom_normals.id = "geometry" + primgroups + "-mesh-map-array";
                NormalList normals = SkinChunk.GetChildren <PrimitiveGroupCTTR>()[primgroups].GetChildren <NormalList>()[0];
                geom_normals.count  = (ulong)normals.Normals.Length * 3;
                geom_normals.Values = new double[geom_normals.count];
                for (ulong i = 0; i < geom_normals.count; i++)
                {
                    if (i % 3 == 0)
                    {
                        geom_normals.Values[i] = normals.Normals[i / 3].X;
                    }
                    else if (i % 3 == 1)
                    {
                        geom_normals.Values[i] = normals.Normals[i / 3].Y;
                    }
                    else
                    {
                        geom_normals.Values[i] = normals.Normals[i / 3].Z;
                    }
                }

                newMesh.source[1].Item                             = geom_normals;
                newMesh.source[1].technique_common                 = new sourceTechnique_common();
                newMesh.source[1].technique_common.accessor        = new accessor();
                newMesh.source[1].technique_common.accessor.source = "#" + geom_normals.id;
                newMesh.source[1].technique_common.accessor.count  = geom_positions.count / 3;
                newMesh.source[1].technique_common.accessor.stride = 3;
                newMesh.source[1].technique_common.accessor.param  = new param[3] {
                    new param(), new param(), new param(),
                };
                newMesh.source[1].technique_common.accessor.param[0].name = "X";
                newMesh.source[1].technique_common.accessor.param[0].type = "float";
                newMesh.source[1].technique_common.accessor.param[1].name = "Y";
                newMesh.source[1].technique_common.accessor.param[1].type = "float";
                newMesh.source[1].technique_common.accessor.param[2].name = "Z";
                newMesh.source[1].technique_common.accessor.param[2].type = "float";

                newMesh.source[2]    = new source();
                newMesh.source[2].id = "geometry" + primgroups + "-mesh-map-0";
                float_array geom_texcoords = new float_array();
                geom_texcoords.id = "geometry" + primgroups + "-mesh-map-array";
                UVList UV = SkinChunk.GetChildren <PrimitiveGroupCTTR>()[primgroups].GetChildren <UVList>()[0];
                geom_texcoords.count  = (ulong)UV.UVs.Length * 2;
                geom_texcoords.Values = new double[geom_texcoords.count];
                for (ulong i = 0; i < geom_texcoords.count; i++)
                {
                    ulong pos = i / 2;
                    geom_texcoords.Values[i] = UV.UVs[pos].X;
                    i++;
                    geom_texcoords.Values[i] = UV.UVs[pos].Y;
                }

                newMesh.source[2].Item                             = geom_texcoords;
                newMesh.source[2].technique_common                 = new sourceTechnique_common();
                newMesh.source[2].technique_common.accessor        = new accessor();
                newMesh.source[2].technique_common.accessor.source = "#" + geom_texcoords.id;
                newMesh.source[2].technique_common.accessor.count  = geom_texcoords.count / 2;
                newMesh.source[2].technique_common.accessor.stride = 2;
                newMesh.source[2].technique_common.accessor.param  = new param[2] {
                    new param(), new param(),
                };
                newMesh.source[2].technique_common.accessor.param[0].name = "S";
                newMesh.source[2].technique_common.accessor.param[0].type = "float";
                newMesh.source[2].technique_common.accessor.param[1].name = "T";
                newMesh.source[2].technique_common.accessor.param[1].type = "float";

                /*
                 * newMesh.source[3].id = "geometry" + primgroups + "-colors-Col";
                 * float_array geom_colors = new float_array();
                 * geom_colors.id = "geometry" + primgroups + "-colors-Col-array";
                 * ColourList colors = SkinChunk.GetChildren<PrimitiveGroupCTTR>()[primgroups].GetChildren<ColourList>()[0];
                 * geom_colors.count = (ulong)colors.Colours.Length * 3;
                 * geom_colors.Values = new double[geom_colors.count];
                 * for (ulong i = 0; i < geom_colors.count / 3; i++)
                 * {
                 *  if (i % 3 == 0)
                 *  {
                 *      geom_colors.Values[i] = colors.Colours[i];
                 *  }
                 *  else if (i % 3 == 1)
                 *  {
                 *      geom_colors.Values[i] = colors.Colours[i / 3];
                 *  }
                 *  else
                 *  {
                 *      geom_colors.Values[i] = colors.Colours[i / 3];
                 *  }
                 * }
                 *
                 * newMesh.source[3].Item = geom_colors;
                 * newMesh.source[3].technique_common = new sourceTechnique_common();
                 * newMesh.source[3].technique_common.accessor = new accessor();
                 * newMesh.source[3].technique_common.accessor.source = geom_colors.id;
                 * newMesh.source[3].technique_common.accessor.count = geom_colors.count / 3;
                 * newMesh.source[3].technique_common.accessor.stride = 3;
                 * newMesh.source[3].technique_common.accessor.param = new param[3];
                 * newMesh.source[3].technique_common.accessor.param[0].name = "R";
                 * newMesh.source[3].technique_common.accessor.param[0].type = "float";
                 * newMesh.source[3].technique_common.accessor.param[1].name = "G";
                 * newMesh.source[3].technique_common.accessor.param[1].type = "float";
                 * newMesh.source[3].technique_common.accessor.param[2].name = "B";
                 * newMesh.source[3].technique_common.accessor.param[2].type = "float";
                 */

                polylist meshTriangles = new polylist();
                meshTriangles.material          = "";
                meshTriangles.count             = (ulong)SkinChunk.GetChildren <PrimitiveGroupCTTR>()[primgroups].GetChildren <IndexList>()[0].Indices.Length / 4;
                meshTriangles.input             = new InputLocalOffset[3];
                meshTriangles.input[0]          = new InputLocalOffset();
                meshTriangles.input[0].semantic = "VERTEX";
                meshTriangles.input[0].source   = "#" + newMesh.vertices.id;
                meshTriangles.input[0].offset   = 0;
                meshTriangles.input[1]          = new InputLocalOffset();
                meshTriangles.input[1].semantic = "NORMAL";
                meshTriangles.input[1].source   = "#" + "geometry" + primgroups + "-mesh-normals";
                meshTriangles.input[1].offset   = 1;
                meshTriangles.input[2]          = new InputLocalOffset();
                meshTriangles.input[2].semantic = "TEXCOORD";
                meshTriangles.input[2].source   = "#" + "geometry" + primgroups + "-mesh-map-0";
                meshTriangles.input[2].offset   = 2;
                meshTriangles.input[2].set      = 0;
                string packed_primitives = "";
                for (int i = 0; i < SkinChunk.GetChildren <PrimitiveGroupCTTR>()[primgroups].GetChildren <IndexList>()[0].Indices.Length; i++)
                {
                    packed_primitives += SkinChunk.GetChildren <PrimitiveGroupCTTR>()[primgroups].GetChildren <IndexList>()[0].Indices[i];
                    packed_primitives += " ";
                }
                string packed_vcount = "";
                for (int i = 0; i < SkinChunk.GetChildren <PrimitiveGroupCTTR>()[primgroups].GetChildren <IndexList>()[0].Indices.Length / 3; i++)
                {
                    packed_vcount += "3 ";
                }
                meshTriangles.vcount = packed_vcount;

                meshTriangles.p = packed_primitives;

                newMesh.Items    = new object[1];
                newMesh.Items[0] = meshTriangles;

                cachedGeoms.geometry[primgroups].Item = newMesh;

                for (int i = 0; i < SkinChunk.GetChildren <PrimitiveGroupCTTR>()[primgroups].GetChildren <IndexList>()[0].Indices.Length; i++)
                {
                    IndexList.Add(SkinChunk.GetChildren <PrimitiveGroupCTTR>()[primgroups].GetChildren <IndexList>()[0].Indices[i]);
                }
            }

            cachedMats.material = new material[ShaderChunks.Length];
            List <string> shader_tex = new List <string>();

            for (int mat = 0; mat < ShaderChunks.Length; mat++)
            {
                cachedMats.material[mat]                     = new material();
                cachedMats.material[mat].id                  = "mat" + ShaderChunks[mat].Name;
                cachedMats.material[mat].name                = ShaderChunks[mat].Name;
                cachedMats.material[mat].instance_effect     = new instance_effect();
                cachedMats.material[mat].instance_effect.url = "#" + ShaderChunks[mat].Name; //effect name
                if (ShaderChunks[mat].GetChildren <ShaderTextureParam>().Length > 0)
                {
                    if (!shader_tex.Contains(ShaderChunks[mat].GetChildren <ShaderTextureParam>()[0].Value))
                    {
                        shader_tex.Add(ShaderChunks[mat].GetChildren <ShaderTextureParam>()[0].Value);
                    }
                }
            }

            cachedImages.image = new image[shader_tex.Count];
            for (int i = 0; i < cachedImages.image.Length; i++)
            {
                cachedImages.image[i]    = new image();
                cachedImages.image[i].id = "image" + shader_tex[i];
                //fx_surface_init_from_common init_from = new fx_surface_init_from_common();
                //init_from.Value = shader_tex[i];
                //cachedImages.image[i].Item = init_from;
            }

            cachedEffects.effect = new effect[ShaderChunks.Length];
            for (int mat = 0; mat < ShaderChunks.Length; mat++)
            {
                cachedEffects.effect[mat]                                        = new effect();
                cachedEffects.effect[mat].id                                     = ShaderChunks[mat].Name;
                cachedEffects.effect[mat].name                                   = ShaderChunks[mat].Name;
                cachedEffects.effect[mat].newparam                               = new fx_newparam_common[2];
                cachedEffects.effect[mat].newparam[0]                            = new fx_newparam_common();
                cachedEffects.effect[mat].newparam[0].sid                        = "Image-surface";
                cachedEffects.effect[mat].newparam[0].surface                    = new fx_surface_common();
                cachedEffects.effect[mat].newparam[0].surface.type               = fx_surface_type_enum.Item2D;
                cachedEffects.effect[mat].newparam[0].surface.init_from          = new fx_surface_init_from_common[1];
                cachedEffects.effect[mat].newparam[0].surface.init_from[0]       = new fx_surface_init_from_common();
                cachedEffects.effect[mat].newparam[0].surface.init_from[0].Value = ShaderChunks[mat].Name;
                cachedEffects.effect[mat].newparam[0].surface.format             = "A8R8G8B8";

                cachedEffects.effect[mat].newparam[1]                     = new fx_newparam_common();
                cachedEffects.effect[mat].newparam[1].sid                 = "Image-sampler";
                cachedEffects.effect[mat].newparam[1].sampler2D           = new fx_sampler2D_common();
                cachedEffects.effect[mat].newparam[1].sampler2D.source    = "Image-surface";
                cachedEffects.effect[mat].newparam[1].sampler2D.wrap_s    = fx_sampler_wrap_common.CLAMP;
                cachedEffects.effect[mat].newparam[1].sampler2D.wrap_t    = fx_sampler_wrap_common.CLAMP;
                cachedEffects.effect[mat].newparam[1].sampler2D.minfilter = fx_sampler_filter_common.NEAREST;
                cachedEffects.effect[mat].newparam[1].sampler2D.magfilter = fx_sampler_filter_common.NEAREST;
                cachedEffects.effect[mat].newparam[1].sampler2D.mipfilter = fx_sampler_filter_common.NEAREST;

                cachedEffects.effect[mat].Items                  = new effectFx_profile_abstractProfile_COMMON[1];
                cachedEffects.effect[mat].Items[0]               = new effectFx_profile_abstractProfile_COMMON();
                cachedEffects.effect[mat].Items[0].technique     = new effectFx_profile_abstractProfile_COMMONTechnique();
                cachedEffects.effect[mat].Items[0].technique.sid = "common";
                effectFx_profile_abstractProfile_COMMONTechniquePhong common_phong = new effectFx_profile_abstractProfile_COMMONTechniquePhong();
                common_color_or_texture_typeTexture textureType = new common_color_or_texture_typeTexture();
                textureType.texture           = "Image-sampler";
                textureType.texcoord          = "tc";
                common_phong.diffuse          = new common_color_or_texture_type();
                common_phong.diffuse.Item     = textureType;
                common_phong.transparent      = new common_transparent_type();
                common_phong.transparent.Item = textureType;

                cachedEffects.effect[mat].Items[0].technique.Item = common_phong;
            }

            cachedControllers.controller = new controller[SkinChunk.NumPrimGroups];

            for (int a = 0; a < SkinChunk.NumPrimGroups; a++)
            {
                cachedControllers.controller[a]      = new controller();
                cachedControllers.controller[a].id   = SkinChunk.Name + a;
                cachedControllers.controller[a].name = SkinChunk.Name + a;

                skin ControllerSkin = new skin();

                ControllerSkin.source1 = "#geometry" + a;
                ControllerSkin.source  = new source[3];

                ControllerSkin.source[0]    = new source();
                ControllerSkin.source[0].id = "controller" + a + "-joints";
                Name_array Joints_Names = new Name_array();
                Joints_Names.id     = "controller" + a + "-joints-array";
                Joints_Names.count  = (ulong)SkeletonChunk.GetChildren <SkeletonJointCTTR>().Length;
                Joints_Names.Values = new string[Joints_Names.count];
                for (ulong i = 0; i < Joints_Names.count; i++)
                {
                    Joints_Names.Values[i] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].Name;
                }

                ControllerSkin.source[0].Item                             = Joints_Names;
                ControllerSkin.source[0].technique_common                 = new sourceTechnique_common();
                ControllerSkin.source[0].technique_common.accessor        = new accessor();
                ControllerSkin.source[0].technique_common.accessor.source = "#" + Joints_Names.id;
                ControllerSkin.source[0].technique_common.accessor.count  = Joints_Names.count;
                ControllerSkin.source[0].technique_common.accessor.param  = new param[1] {
                    new param()
                };
                ControllerSkin.source[0].technique_common.accessor.param[0].name = "JOINT";
                ControllerSkin.source[0].technique_common.accessor.param[0].type = "Name";

                ControllerSkin.source[1]    = new source();
                ControllerSkin.source[1].id = "controller" + a + "-bind_poses";
                float_array Bind_Poses = new float_array();
                Bind_Poses.id     = "controller" + a + "-bind_poses-array";
                Bind_Poses.count  = (ulong)SkeletonChunk.GetChildren <SkeletonJointCTTR>().Length * 16;
                Bind_Poses.Values = new double[Bind_Poses.count];
                int bind_pose_pos = 0;
                for (ulong i = 0; i < Joints_Names.count; i++)
                {
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M11;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M12;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M13;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M14;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M21;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M22;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M23;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M24;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M31;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M32;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M33;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M34;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M41;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M42;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M43;
                    bind_pose_pos++;
                    Bind_Poses.Values[bind_pose_pos] = SkeletonChunk.GetChildren <SkeletonJointCTTR>()[i].RestPose.M44;
                    bind_pose_pos++;
                }

                ControllerSkin.source[1].Item                             = Bind_Poses;
                ControllerSkin.source[1].technique_common                 = new sourceTechnique_common();
                ControllerSkin.source[1].technique_common.accessor        = new accessor();
                ControllerSkin.source[1].technique_common.accessor.source = "#" + Bind_Poses.id;
                ControllerSkin.source[1].technique_common.accessor.count  = Bind_Poses.count;
                ControllerSkin.source[1].technique_common.accessor.param  = new param[1] {
                    new param()
                };
                ControllerSkin.source[1].technique_common.accessor.param[0].name = "TRANSFORM";
                ControllerSkin.source[1].technique_common.accessor.param[0].type = "float4x4";

                ControllerSkin.source[2]    = new source();
                ControllerSkin.source[2].id = "controller" + a + "-weights";
                float_array Weights_Array = new float_array();
                Weights_Array.id     = "controller" + a + "-weights-array";
                Weights_Array.count  = Joints_Names.count;
                Weights_Array.Values = new double[Joints_Names.count];
                for (int i = 0; i < Weights_Array.Values.Length; i++)
                {
                    Weights_Array.Values[i] = 1;
                }

                ControllerSkin.source[2].Item                             = Weights_Array;
                ControllerSkin.source[2].technique_common                 = new sourceTechnique_common();
                ControllerSkin.source[2].technique_common.accessor        = new accessor();
                ControllerSkin.source[2].technique_common.accessor.source = "#" + Weights_Array.id;
                ControllerSkin.source[2].technique_common.accessor.count  = Weights_Array.count;
                ControllerSkin.source[2].technique_common.accessor.param  = new param[1] {
                    new param()
                };
                ControllerSkin.source[2].technique_common.accessor.param[0].name = "WEIGHT";
                ControllerSkin.source[2].technique_common.accessor.param[0].type = "float";

                ControllerSkin.joints       = new skinJoints();
                ControllerSkin.joints.input = new InputLocal[2] {
                    new InputLocal(), new InputLocal()
                };
                ControllerSkin.joints.input[0].semantic = "JOINT";
                ControllerSkin.joints.input[0].source   = "#" + ControllerSkin.source[0].id;
                ControllerSkin.joints.input[1].semantic = "INV_BIND_MATRIX";
                ControllerSkin.joints.input[1].source   = "#" + ControllerSkin.source[1].id;

                ControllerSkin.vertex_weights       = new skinVertex_weights();
                ControllerSkin.vertex_weights.count = (ulong)IndexList.Count;
                ControllerSkin.vertex_weights.input = new InputLocalOffset[2] {
                    new InputLocalOffset(), new InputLocalOffset()
                };
                ControllerSkin.vertex_weights.input[0].semantic = "JOINT";
                ControllerSkin.vertex_weights.input[0].source   = "#" + ControllerSkin.source[0].id;
                ControllerSkin.vertex_weights.input[0].offset   = 0;
                ControllerSkin.vertex_weights.input[1].semantic = "WEIGHT";
                ControllerSkin.vertex_weights.input[1].source   = "#" + ControllerSkin.source[2].id;
                ControllerSkin.vertex_weights.input[1].offset   = 1;
                string vertex_vcount = "";
                for (int i = 0; i < IndexList.Count; i++)
                {
                    vertex_vcount += "1 ";
                }
                ControllerSkin.vertex_weights.vcount = vertex_vcount;

                string index_list_str = "";
                for (int i = 0; i < IndexList.Count; i++)
                {
                    index_list_str += IndexList[i] + " ";
                }

                ControllerSkin.vertex_weights.v = index_list_str;

                cachedControllers.controller[a].Item = ControllerSkin;
            }

            cachedVscenes.visual_scene = new visual_scene[1] {
                new visual_scene()
            };
            cachedVscenes.visual_scene[0].id      = "Scene0";
            cachedVscenes.visual_scene[0].name    = "Scene0";
            cachedVscenes.visual_scene[0].node    = new node[SkinChunk.NumPrimGroups + 1];
            cachedVscenes.visual_scene[0].node[0] = new node();
            //cachedVscenes.visual_scene[0].node[0].Items = new object[1];
            //cachedVscenes.visual_scene[0].node[0].Items[0] = new matrix();

            for (int i = 0; i < SkeletonChunk.Children.Count; i++)
            {
                SkeletonJointCTTR joint = (SkeletonJointCTTR)SkeletonChunk.Children[i];
                if (joint.SkeletonParent == 0)
                {
                    //cachedVscenes.visual_scene[0].node[0].node1 = new node[10];
                }
            }

            cachedVscenes.visual_scene[0].node[0].id   = SkeletonChunk.Name;
            cachedVscenes.visual_scene[0].node[0].type = NodeType.JOINT;

            //todo: joints node tree
            // SkeletonParent - 0 means root, the rest is chunk child index
            // SkeletonJointCTTR.BindPose matrix as transform matrix?

            for (int i = 1; i < SkinChunk.NumPrimGroups + 1; i++)
            {
                cachedVscenes.visual_scene[0].node[i] = new node();

                cachedVscenes.visual_scene[0].node[i].id   = "node" + i;
                cachedVscenes.visual_scene[0].node[i].name = "polygon" + i;
                cachedVscenes.visual_scene[0].node[i].type = NodeType.NODE;
                cachedVscenes.visual_scene[0].node[i].instance_controller = new instance_controller[1] {
                    new instance_controller()
                };
                cachedVscenes.visual_scene[0].node[i].instance_controller[0].url      = "#" + cachedControllers.controller[i - 1].id;
                cachedVscenes.visual_scene[0].node[i].instance_controller[0].skeleton = new string[1] {
                    "#" + cachedVscenes.visual_scene[0].node[0].id
                };
                cachedVscenes.visual_scene[0].node[i].instance_controller[0].bind_material = new bind_material();
                cachedVscenes.visual_scene[0].node[i].instance_controller[0].bind_material.technique_common = new instance_material[1] {
                    new instance_material()
                };
                cachedVscenes.visual_scene[0].node[i].instance_controller[0].bind_material.technique_common[0].symbol            = "#" + cachedMats.material[0].id;
                cachedVscenes.visual_scene[0].node[i].instance_controller[0].bind_material.technique_common[0].target            = "#" + cachedMats.material[0].id;
                cachedVscenes.visual_scene[0].node[i].instance_controller[0].bind_material.technique_common[0].bind_vertex_input = new instance_materialBind_vertex_input[1] {
                    new instance_materialBind_vertex_input()
                };
                cachedVscenes.visual_scene[0].node[i].instance_controller[0].bind_material.technique_common[0].bind_vertex_input[0].semantic       = "tc";
                cachedVscenes.visual_scene[0].node[i].instance_controller[0].bind_material.technique_common[0].bind_vertex_input[0].input_semantic = "TEXCOORD";
            }



            //not working:
            // - vertex weights error out
            // - mesh comes out wrong

            //animclips
            //anims
        }
Ejemplo n.º 3
0
        internal DAEEffect(effect efx)
        {
            foreach (effectFx_profile_abstractProfile_COMMON profile in efx.Items)
            {
                if (profile.Items != null)
                {
                    foreach (var item in profile.Items)
                    {
                        if (item is common_newparam_type)
                        {
                            common_newparam_type newparam = item as common_newparam_type;
                            if (newparam.Item is fx_surface_common)
                            {
                                foreach (fx_surface_init_from_common initFrom in (newparam.Item as fx_surface_common).init_from)
                                {
                                    _imageId = initFrom.Value;
                                    break;
                                }
                            }
                        }
                    }
                }

                effectFx_profile_abstractProfile_COMMONTechnique technique = profile.technique;

                DAEVector4     transpColor  = new DAEVector4(1, 1, 1, 1);
                double         transparency = 1;
                fx_opaque_enum opaqueMode   = fx_opaque_enum.RGB_ZERO;

                if (technique.Item is effectFx_profile_abstractProfile_COMMONTechniquePhong) // phong
                {
                    effectFx_profile_abstractProfile_COMMONTechniquePhong p = technique.Item as effectFx_profile_abstractProfile_COMMONTechniquePhong;
                    if (p.transparent != null)
                    {
                        if (p.transparency != null)
                        {
                            if (p.transparency.Item is common_float_or_param_typeFloat)
                            {
                                opaqueMode   = p.transparent.opaque;
                                transpColor  = GetRgbaColor(p.transparent.Item);
                                transparency = (p.transparency.Item as common_float_or_param_typeFloat).Value;
                            }
                        }
                    }

                    if (p.ambient != null)
                    {
                        _ambient = GetColor(opaqueMode, GetRgbaColor(p.ambient.Item), transpColor, transparency);
                    }

                    if (p.diffuse != null)
                    {
                        _diffuse = GetColor(opaqueMode, GetRgbaColor(p.diffuse.Item), transpColor, transparency);
                    }

                    if (p.specular != null)
                    {
                        _specular = GetColor(opaqueMode, GetRgbaColor(p.specular.Item), transpColor, transparency);
                    }

                    if (p.shininess != null && p.shininess.Item is common_float_or_param_typeFloat)
                    {
                        _shininess = (float)(p.shininess.Item as common_float_or_param_typeFloat).Value;
                    }
                }
                else if (technique.Item is effectFx_profile_abstractProfile_COMMONTechniqueBlinn) // blinn
                {
                    effectFx_profile_abstractProfile_COMMONTechniqueBlinn p = technique.Item as effectFx_profile_abstractProfile_COMMONTechniqueBlinn;
                    if (p.transparent != null)
                    {
                        if (p.transparency != null)
                        {
                            if (p.transparency.Item is common_float_or_param_typeFloat)
                            {
                                opaqueMode   = p.transparent.opaque;
                                transpColor  = GetRgbaColor(p.transparent.Item);
                                transparency = (p.transparency.Item as common_float_or_param_typeFloat).Value;
                            }
                        }
                    }

                    if (p.ambient != null)
                    {
                        _ambient = GetColor(opaqueMode, GetRgbaColor(p.ambient.Item), transpColor, transparency);
                    }

                    if (p.diffuse != null)
                    {
                        _diffuse = GetColor(opaqueMode, GetRgbaColor(p.diffuse.Item), transpColor, transparency);
                    }

                    if (p.specular != null)
                    {
                        _specular = GetColor(opaqueMode, GetRgbaColor(p.specular.Item), transpColor, transparency);
                    }

                    if (p.shininess != null && p.shininess.Item is common_float_or_param_typeFloat)
                    {
                        _shininess = (float)(p.shininess.Item as common_float_or_param_typeFloat).Value;
                    }
                }
                else if (technique.Item is effectFx_profile_abstractProfile_COMMONTechniqueLambert) // lambert
                {
                    effectFx_profile_abstractProfile_COMMONTechniqueLambert p = technique.Item as effectFx_profile_abstractProfile_COMMONTechniqueLambert;
                    if (p.transparent != null)
                    {
                        if (p.transparency != null)
                        {
                            if (p.transparency.Item is common_float_or_param_typeFloat)
                            {
                                opaqueMode   = p.transparent.opaque;
                                transpColor  = GetRgbaColor(p.transparent.Item);
                                transparency = (p.transparency.Item as common_float_or_param_typeFloat).Value;
                            }
                        }
                    }

                    if (p.ambient != null)
                    {
                        _ambient = GetColor(opaqueMode, GetRgbaColor(p.ambient.Item), transpColor, transparency);
                    }

                    if (p.diffuse != null)
                    {
                        _diffuse = GetColor(opaqueMode, GetRgbaColor(p.diffuse.Item), transpColor, transparency);
                    }

                    _specular = new DAEVector4(0.0f, 0.0f, 0.0f, 0.0f);
                }
                else if (technique.Item is effectFx_profile_abstractProfile_COMMONTechniqueConstant) // constant
                {
                    effectFx_profile_abstractProfile_COMMONTechniqueConstant p = technique.Item as effectFx_profile_abstractProfile_COMMONTechniqueConstant;
                    if (p.transparent != null)
                    {
                        if (p.transparency != null)
                        {
                            if (p.transparency.Item is common_float_or_param_typeFloat)
                            {
                                opaqueMode   = p.transparent.opaque;
                                transpColor  = GetRgbaColor(p.transparent.Item);
                                transparency = (p.transparency.Item as common_float_or_param_typeFloat).Value;
                            }
                        }
                    }

                    if (p.emission != null)
                    {
                        _ambient   = GetColor(opaqueMode, GetRgbaColor(p.emission.Item), transpColor, transparency);
                        _diffuse   = GetColor(opaqueMode, GetRgbaColor(p.emission.Item), transpColor, transparency);
                        _specular  = GetColor(opaqueMode, GetRgbaColor(p.emission.Item), transpColor, transparency);
                        _shininess = 0;
                    }
                }

                _isTransparent = _diffuse.W < 1.0;
            }
        }
Ejemplo n.º 4
0
    private List <string> GetMaterialNames(Material[] materials)
    {
        if (materialCache == null)
        {
            materialCache = new Dictionary <Material, string>();
        }
        if (textureCache == null)
        {
            textureCache = new Dictionary <Texture, Dictionary <Color32, string> >();
        }
        var res = new List <string>();

        for (int i = 0; i < materials.Length; i++)
        {
            Color color = Color.gray;
            if (materials[i].HasProperty("_Color"))
            {
                color = materials[i].color;
            }
            else if (materials[i].HasProperty("_MainColor"))
            {
                color = materials[i].GetColor("_MainColor");
            }
            Color32 c32 = color;

            string textureName = "";
            if (materials[i].mainTexture != null)
            {
                if (textureCache.ContainsKey(materials[i].mainTexture))
                {
                    var colorDict = textureCache[materials[i].mainTexture];
                    colorDict.TryGetValue(c32, out textureName);
                }
                else
                {
                    textureCache[materials[i].mainTexture] = new Dictionary <Color32, string>();
                }
                if (textureName == "")
                {
                    if (!textureCache[materials[i].mainTexture].TryGetValue(c32, out textureName))
                    {
                        textureName = "tex_" + textureCache.Count + Color2String(c32);
                        textureCache[materials[i].mainTexture][c32] = textureName;
                        Texture2D t2d = (Texture2D)materials[i].mainTexture;

                        byte[] bytes = MakeReadable(t2d, color, maxTextureSize).EncodeToPNG();

                        File.WriteAllBytes(workingPath + "/" + textureName + ".png", bytes);

                        var image = new image();
                        image.id   = textureName;
                        image.name = textureName;
                        image.Item = textureName + ".png";
                        images.Add(image);
                    }
                }
            }
            if (materialCache.ContainsKey(materials[i]))
            {
                res.Add(materialCache[materials[i]]);
            }
            else
            {
                // create effects
                effects.Add(new effect());
                var effect   = effects[effects.Count - 1];
                var effectId = CreateId();
                effect.id = effectId;

                if (textureName != "")
                {
                    effect.newparam = new fx_newparam_common[]
                    {
                        new fx_newparam_common(),
                        new fx_newparam_common()
                    };
                    effect.newparam[0].sid               = textureName + "-surface";
                    effect.newparam[0].surface           = new fx_surface_common();
                    effect.newparam[0].surface.type      = fx_surface_type_enum.Item2D;
                    effect.newparam[0].surface.init_from = new fx_surface_init_from_common[]
                    {
                        new fx_surface_init_from_common()
                    };
                    effect.newparam[0].surface.init_from[0].Value = textureName;

                    effect.newparam[1].sid              = textureName + "-sampler";
                    effect.newparam[1].sampler2D        = new fx_sampler2D_common();
                    effect.newparam[1].sampler2D.source = textureName + "-surface";
                }

                effect.Items = new effectFx_profile_abstractProfile_COMMON[]
                {
                    new effectFx_profile_abstractProfile_COMMON()
                };
                effect.Items[0].technique     = new effectFx_profile_abstractProfile_COMMONTechnique();
                effect.Items[0].technique.sid = "COMMON";
                var phong = new effectFx_profile_abstractProfile_COMMONTechniquePhong();
                effect.Items[0].technique.Item = phong;

                phong.diffuse = new common_color_or_texture_type();
                //if (true)
                if (textureName == "")
                {
                    SetPhong(phong, new Vector4(color.r, color.g, color.b, color.a));
                }
                else
                {
                    SetPhongTex(phong, textureName + "-sampler");
                }


                // create materials
                this.materials.Add(new material());

                var material = this.materials[this.materials.Count - 1];

                var materialId = "mat_" + CreateId();
                material.id = materialId;

                material.name                = materials[i].name;
                material.instance_effect     = new instance_effect();
                material.instance_effect.url = "#" + effectId;

                materialCache[materials[i]] = materialId;
                res.Add(materialId);
            }
        }
        return(res);
    }
Ejemplo n.º 5
0
    public ExportToCollada(string workingPath)
    {
        this.workingPath = workingPath;
        collada          = new COLLADA();

        geometries = new List <geometry>();
        nodes      = new List <node>();

        meshLookup = new Dictionary <Mesh, string>();

        ass = new asset();

        ass.up_axis       = UpAxisType.Y_UP;
        ass.unit          = new assetUnit();
        ass.unit.meter    = 1;
        ass.unit.name     = "meter";
        libraryGeometries = new library_geometries();
        // create effects
        libraryEffects = new library_effects();
        effects        = new List <effect>();
        effects.Add(new effect());

        var effectId = CreateId();

        effects[0].id    = effectId;
        effects[0].Items = new effectFx_profile_abstractProfile_COMMON[]
        {
            new effectFx_profile_abstractProfile_COMMON()
        };
        effects[0].Items[0].technique     = new effectFx_profile_abstractProfile_COMMONTechnique();
        effects[0].Items[0].technique.sid = "COMMON";
        var phong = new effectFx_profile_abstractProfile_COMMONTechniquePhong();

        effects[0].Items[0].technique.Item = phong;
        SetPhong(phong, new Vector4(0.5f, 0.5f, 0.5f, 1));


        // create materials
        libraryMaterials = new library_materials();
        materials        = new List <material>();
        materials.Add(new material());

        materialId      = CreateId();
        materials[0].id = materialId;

        materials[0].name                = defaultMaterialName;
        materials[0].instance_effect     = new instance_effect();
        materials[0].instance_effect.url = "#" + effectId;

        // create visual scenes
        visualScenes = new library_visual_scenes();

        visualScene = new visual_scene();
        visualScenes.visual_scene = new visual_scene[]
        {
            visualScene
        };
        var visualSceneId = CreateId();

        visualScenes.visual_scene[0].id = visualSceneId;

        libraryImages = new library_images();
        images        = new List <image>();

        Build();

        collada.scene = new COLLADAScene();
        collada.scene.instance_visual_scene = new InstanceWithExtra();



        collada.scene.instance_visual_scene.url = "#" + visualSceneId;
    }