Beispiel #1
0
        private static void InitProgress(Module.Import.Assimp.Context context, Module.ProgressCallback callback, aiScene scene)
        {
            uint nb_textures = 0;

            using (aiMaterialArray assimp_materials = scene.Materials)
            {
                uint nb_materials = assimp_materials.Size();

                for (uint i = 0; i < nb_materials; i++)
                {
                    using (aiMaterial material = assimp_materials.Get(i))
                    {
                        foreach (KeyValuePair <string, aiTextureType> pair in Assimp.Convert.textureTypes)
                        {
                            using (aiString texture_name = new aiString())
                            {
                                if (material.GetTexturePath(pair.Value, 0, texture_name))
                                {
                                    nb_textures++;
                                }
                            }
                        }
                    }
                }
            }

            uint nb_steps = Node.ASSIMP_PROGRESS_FACTOR * CountNodes(scene.mRootNode);

            nb_steps += Mesh.ASSIMP_PROGRESS_FACTOR * scene.Meshes.Size();
            nb_steps += Material.ASSIMP_PROGRESS_FACTOR * scene.Materials.Size();
            nb_steps += Texture.ASSIMP_PROGRESS_FACTOR * nb_textures;
            nb_steps  = (uint)(nb_steps / (1f - assimpNativeLoadingPrecentage));

            context.progress.Init(nb_steps, callback);
        }
Beispiel #2
0
        public static void FromAssimp(Module.Import.Assimp.Context context, aiScene scene)
        {
            if (scene.HasMaterials())
            {
                using (aiMaterialArray assimp_materials = scene.Materials)
                {
                    uint material_size = assimp_materials.Size();

                    // Reserve the right amount of memory
                    context.scene.materials = new Material[(int)material_size + 1];

                    // Create a material for lines
                    Material line_material = new Material();
                    line_material.name   = "Line";
                    line_material.shader = defaultAssimpLineShader;
                    line_material.floats = new Dictionary <string, float>();
                    line_material.colors = new Dictionary <string, Color>();
                    line_material.floats.Add(defaultAssimpLineShaderWidth, unityLineWidth);
                    line_material.colors.Add(Assimp.Convert.unityDiffuseColorName, Color.black);
                    context.scene.materials[(int)material_size] = line_material;

                    // Load all the materials
                    for (uint i = 0; i < material_size; i++)
                    {
                        aiMaterial material = assimp_materials.Get(i);

                        // LoadMaterial must dispose of the given material afterward
                        // We must use a proxy method for saving the result into the array because the index i is captured by the lambda otherwise and it's value is indefinite across multiple threads.
                        context.threads.ExecAndSaveToArray(context.scene.materials, (int)i, () => FromAssimp(context, scene, material));
                    }
                }
            }
        }
Beispiel #3
0
        public static void ToAssimp(Module.Export.Assimp.Context context, Scene scene)
        {
            if (scene.materials != null && scene.materials.Length > 0)
            {
                using (aiMaterialArray materials = context.scene.Materials)
                {
                    uint count = (uint)scene.materials.Length;

                    materials.Reserve(count, true);

                    for (uint i = 0; i < count; i++)
                    {
                        uint index = i;                                // To avoid problems of lambda expression getting 'for' variable by reference (even if uint are not ref normaly!)

                        aiMaterial assimp_material = new aiMaterial(); // Allocation in another thread fails so we must do it before starting the task

                        materials.Set(index, assimp_material.Unmanaged());

                        context.threads.AddTask(() => scene.materials[index].ToAssimp(context, scene, assimp_material));
                    }
                }
            }
        }
Beispiel #4
0
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(aiMaterialArray obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }