Example #1
0
        public static Lib3dsMeshInstanceNode lib3ds_node_new_mesh_instance(Lib3dsMesh mesh, string instance_name, float[] pos0, float[] scl0, float[] rot0)
        {
            Lib3dsNode node = lib3ds_node_new(Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE);

            if (mesh != null)
            {
                node.name = mesh.name;
            }
            else
            {
                node.name = "$$$DUMMY";
            }

            Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;

            if (instance_name != null)
            {
                n.instance_name = instance_name;
            }
            else
            {
                n.instance_name = "";
            }

            lib3ds_track_resize(n.pos_track, 1);
            if (pos0 != null)
            {
                lib3ds_vector_copy(n.pos_track.keys[0].value, pos0);
            }

            lib3ds_track_resize(n.scl_track, 1);
            if (scl0 != null)
            {
                lib3ds_vector_copy(n.scl_track.keys[0].value, scl0);
            }
            else
            {
                lib3ds_vector_make(n.scl_track.keys[0].value, 1, 1, 1);
            }

            lib3ds_track_resize(n.rot_track, 1);
            if (rot0 != null)
            {
                for (int i = 0; i < 4; i++)
                {
                    n.rot_track.keys[0].value[i] = rot0[i];
                }
            }
            else
            {
                for (int i = 0; i < 4; i++)
                {
                    n.rot_track.keys[0].value[i] = 0;
                }
            }

            return(n);
        }
Example #2
0
        public static Lib3dsMesh lib3ds_file_mesh_for_node(Lib3dsFile file, Lib3dsNode node)
        {
            if (node.type != Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE)
            {
                return(null);
            }
            Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
            int index = lib3ds_file_mesh_by_name(file, node.name);

            return((index >= 0)?file.meshes[index]:null);
        }
Example #3
0
 public static void AddMeshTo3DS(Lib3dsFile res, PSKFile f, Matrix m)
 {
     Lib3dsMesh mesh = new Lib3dsMesh();
     string name =  "Box00" + res.meshes.Count.ToString();
     mesh.name = name;
     mesh.matrix = Matrix2FA(Matrix.Identity);
     mesh.vertices = new List<Lib3dsVertex>();
     foreach (PSKFile.PSKPoint p in f.psk.points)
     {
         Vector3 v = p.ToVector3();
         v = Vector3.TransformCoordinate(v, m);
         mesh.vertices.Add(new Lib3dsVertex(v.X, -v.Y, v.Z));
     }
     mesh.texcos = new List<Lib3dsTexturecoordinate>();
     for (int i = 0; i < f.psk.points.Count; i++)
         foreach (PSKFile.PSKEdge e in f.psk.edges)
             if (e.index == i)
                 mesh.texcos.Add(new Lib3dsTexturecoordinate(e.U, e.V));
     mesh.faces = new List<Lib3dsFace>();
     foreach (PSKFile.PSKFace face in f.psk.faces)
     {
         Lib3dsFace ff = new Lib3dsFace();
         ff.flags = 6;
         ff.index = new ushort[3];
         ff.index[0] = (ushort)f.psk.edges[face.v0].index;
         ff.index[1] = (ushort)f.psk.edges[face.v2].index;
         ff.index[2] = (ushort)f.psk.edges[face.v1].index;
         mesh.faces.Add(ff);
     }
     mesh.nfaces = (ushort)mesh.faces.Count;
     mesh.nvertices = (ushort)mesh.vertices.Count;
     mesh.map_type = Lib3dsMapType.LIB3DS_MAP_NONE;
     mesh.object_flags = 0;
     mesh.color = 128;
     res.meshes.Add(mesh);
     Lib3dsNode node = new Lib3dsMeshInstanceNode();
     node.matrixNode = Matrix2FA(Matrix.Identity);
     node.parent = null;
     node.parent_id = 0xffff;
     node.hasNodeID = true;
     node.type = Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE;
     node.flags = res.nodes[0].flags;
     node.node_id = (ushort)(res.meshes.Count() - 1);
     node.name = name;            
     res.nodes.Add(node);
 }
Example #4
0
		// Create and return a new node object.
		//
		// The node is returned with an identity matrix. All other fields
		// are zero.
		//
		// \return Lib3dsNode
		public static Lib3dsNode lib3ds_node_new(Lib3dsNodeType type)
		{
			Lib3dsNode node=null;
			switch(type)
			{
				case Lib3dsNodeType.LIB3DS_NODE_AMBIENT_COLOR:
					{
						Lib3dsAmbientColorNode n=new Lib3dsAmbientColorNode();
						node=n;
						node.name="$AMBIENT$";
						n.color_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						break;
					}
				case Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE:
					{
						Lib3dsMeshInstanceNode n=new Lib3dsMeshInstanceNode();
						node=n;
						node.name="$$$DUMMY";
						n.pos_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						n.scl_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						n.rot_track.type=Lib3dsTrackType.LIB3DS_TRACK_QUAT;
						n.hide_track.type=Lib3dsTrackType.LIB3DS_TRACK_BOOL;
						break;
					}
				case Lib3dsNodeType.LIB3DS_NODE_CAMERA:
					{
						Lib3dsCameraNode n=new Lib3dsCameraNode();
						node=n;
						n.pos_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						n.fov_track.type=Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
						n.roll_track.type=Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
						break;
					}
				case Lib3dsNodeType.LIB3DS_NODE_CAMERA_TARGET:
					{
						Lib3dsTargetNode n=new Lib3dsTargetNode();
						node=n;
						n.pos_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						break;
					}
				case Lib3dsNodeType.LIB3DS_NODE_OMNILIGHT:
					{
						Lib3dsOmnilightNode n=new Lib3dsOmnilightNode();
						node=n;
						n.pos_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						n.color_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						break;
					}
				case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT:
					{
						Lib3dsSpotlightNode n=new Lib3dsSpotlightNode();
						node=n;
						n.pos_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						n.color_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						n.hotspot_track.type=Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
						n.falloff_track.type=Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
						n.roll_track.type=Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
						break;
					}
				case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT_TARGET:
					{
						Lib3dsTargetNode n=new Lib3dsTargetNode();
						node=n;
						n.pos_track.type=Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
						break;
					}
				default: Debug.Assert(false); return null;
			}

			node.type=type;
			node.node_id=65535;
			node.parent_id=65535;
			lib3ds_matrix_identity(node.matrixNode);
			return node;
		}
Example #5
0
        public static void lib3ds_node_write(Lib3dsNode node, ushort node_id, ushort parent_id, Lib3dsIo io)
        {
            Lib3dsChunk c_node = new Lib3dsChunk();

            switch (node.type)
            {
            case Lib3dsNodeType.LIB3DS_NODE_AMBIENT_COLOR: c_node.chunk = Lib3dsChunks.CHK_AMBIENT_NODE_TAG; break;

            case Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE: c_node.chunk = Lib3dsChunks.CHK_OBJECT_NODE_TAG; break;

            case Lib3dsNodeType.LIB3DS_NODE_CAMERA: c_node.chunk = Lib3dsChunks.CHK_CAMERA_NODE_TAG; break;

            case Lib3dsNodeType.LIB3DS_NODE_CAMERA_TARGET: c_node.chunk = Lib3dsChunks.CHK_TARGET_NODE_TAG; break;

            case Lib3dsNodeType.LIB3DS_NODE_OMNILIGHT: c_node.chunk = Lib3dsChunks.CHK_LIGHT_NODE_TAG; break;

            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT: c_node.chunk = Lib3dsChunks.CHK_SPOTLIGHT_NODE_TAG; break;

            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT_TARGET: c_node.chunk = Lib3dsChunks.CHK_L_TARGET_NODE_TAG; break;

            default: Debug.Assert(false); return;
            }

            lib3ds_chunk_write_start(c_node, io);

            {             // ---- CHK_NODE_ID ----
                Lib3dsChunk c = new Lib3dsChunk();
                c.chunk = Lib3dsChunks.CHK_NODE_ID;
                c.size  = 8;
                lib3ds_chunk_write(c, io);
                lib3ds_io_write_word(io, node_id);
            }

            {             // ---- CHK_NODE_HDR ----
                Lib3dsChunk c = new Lib3dsChunk();
                c.chunk = Lib3dsChunks.CHK_NODE_HDR;
                c.size  = 6 + 1 + (uint)node.name.Length + 2 + 2 + 2;
                lib3ds_chunk_write(c, io);
                lib3ds_io_write_string(io, node.name);
                lib3ds_io_write_dword(io, node.flags);
                lib3ds_io_write_word(io, parent_id);
            }

            switch (c_node.chunk)
            {
            case Lib3dsChunks.CHK_AMBIENT_NODE_TAG:
            {
                Lib3dsAmbientColorNode n = (Lib3dsAmbientColorNode)node;
                if (n.color_track.keys.Count != 0)
                {                                 // ---- CHK_COL_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_COL_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.color_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
            }
            break;

            case Lib3dsChunks.CHK_OBJECT_NODE_TAG:
            {
                Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                {                                 // ---- CHK_PIVOT ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_PIVOT;
                    c.size  = 18;
                    lib3ds_chunk_write(c, io);
                    lib3ds_io_write_vector(io, n.pivot);
                }

                if (n.instance_name.Length != 0)
                {                                 // ---- CHK_INSTANCE_NAME ----
                    string      name = n.instance_name;
                    Lib3dsChunk c    = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_INSTANCE_NAME;
                    c.size  = 6 + 1 + (uint)name.Length;
                    lib3ds_chunk_write(c, io);
                    lib3ds_io_write_string(io, name);
                }

                {
                    int i = 0;
                    for (i = 0; i < 3; i++)
                    {
                        if (Math.Abs(n.bbox_min[i]) > EPSILON || Math.Abs(n.bbox_max[i]) > EPSILON)
                        {
                            break;
                        }
                    }

                    if (i < 3)
                    {                                     // ---- CHK_BOUNDBOX ----
                        Lib3dsChunk c = new Lib3dsChunk();
                        c.chunk = Lib3dsChunks.CHK_BOUNDBOX;
                        c.size  = 30;
                        lib3ds_chunk_write(c, io);
                        lib3ds_io_write_vector(io, n.bbox_min);
                        lib3ds_io_write_vector(io, n.bbox_max);
                    }
                }

                if (n.pos_track.keys.Count != 0)
                {                                 // ---- CHK_POS_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_POS_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.pos_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.rot_track.keys.Count != 0)
                {                                 // ---- CHK_ROT_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_ROT_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.rot_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.scl_track.keys.Count != 0)
                {                                 // ---- LIB3DS_SCL_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_SCL_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.scl_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.hide_track.keys.Count != 0)
                {                                 // ---- CHK_HIDE_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_HIDE_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.hide_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (Math.Abs(n.morph_smooth) > EPSILON)
                {                                 // ---- CHK_MORPH_SMOOTH ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_MORPH_SMOOTH;
                    c.size  = 10;
                    lib3ds_chunk_write(c, io);
                    lib3ds_io_write_float(io, n.morph_smooth);
                }
            }
            break;

            case Lib3dsChunks.CHK_CAMERA_NODE_TAG:
            {
                Lib3dsCameraNode n = (Lib3dsCameraNode)node;
                if (n.pos_track.keys.Count != 0)
                {                                 // ---- CHK_POS_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_POS_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.pos_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.fov_track.keys.Count != 0)
                {                                 // ---- CHK_FOV_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_FOV_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.fov_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.roll_track.keys.Count != 0)
                {                                 // ---- CHK_ROLL_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_ROLL_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.roll_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
            }
            break;

            case Lib3dsChunks.CHK_TARGET_NODE_TAG:
            {
                Lib3dsTargetNode n = (Lib3dsTargetNode)node;
                if (n.pos_track.keys.Count != 0)
                {                                 // ---- CHK_POS_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_POS_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.pos_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
            }
            break;

            case Lib3dsChunks.CHK_LIGHT_NODE_TAG:
            {
                Lib3dsOmnilightNode n = (Lib3dsOmnilightNode)node;
                if (n.pos_track.keys.Count != 0)
                {                                 // ---- CHK_POS_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_POS_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.pos_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.color_track.keys.Count != 0)
                {                                 // ---- CHK_COL_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_COL_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.color_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
            }
            break;

            case Lib3dsChunks.CHK_SPOTLIGHT_NODE_TAG:
            {
                Lib3dsSpotlightNode n = (Lib3dsSpotlightNode)node;
                if (n.pos_track.keys.Count != 0)
                {                                 // ---- CHK_POS_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_POS_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.pos_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.color_track.keys.Count != 0)
                {                                 // ---- CHK_COL_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_COL_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.color_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.hotspot_track.keys.Count != 0)
                {                                 // ---- CHK_HOT_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_HOT_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.hotspot_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.falloff_track.keys.Count != 0)
                {                                 // ---- CHK_FALL_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_FALL_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.falloff_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
                if (n.roll_track.keys.Count != 0)
                {                                 // ---- CHK_ROLL_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_ROLL_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.roll_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
            }
            break;

            case Lib3dsChunks.CHK_L_TARGET_NODE_TAG:
            {
                Lib3dsTargetNode n = (Lib3dsTargetNode)node;
                if (n.pos_track.keys.Count != 0)
                {                                 // ---- CHK_POS_TRACK_TAG ----
                    Lib3dsChunk c = new Lib3dsChunk();
                    c.chunk = Lib3dsChunks.CHK_POS_TRACK_TAG;
                    lib3ds_chunk_write_start(c, io);
                    lib3ds_track_write(n.pos_track, io);
                    lib3ds_chunk_write_end(c, io);
                }
            }
            break;
            }

            lib3ds_chunk_write_end(c_node, io);
        }
Example #6
0
        public static void lib3ds_node_read(Lib3dsNode node, Lib3dsIo io)
        {
            Lib3dsChunk  c = new Lib3dsChunk();
            Lib3dsChunks chunk;

            Debug.Assert(node != null);
            lib3ds_chunk_read_start(c, 0, io);

            switch (c.chunk)
            {
            case Lib3dsChunks.CHK_AMBIENT_NODE_TAG:
            case Lib3dsChunks.CHK_OBJECT_NODE_TAG:
            case Lib3dsChunks.CHK_CAMERA_NODE_TAG:
            case Lib3dsChunks.CHK_TARGET_NODE_TAG:
            case Lib3dsChunks.CHK_LIGHT_NODE_TAG:
            case Lib3dsChunks.CHK_SPOTLIGHT_NODE_TAG:
            case Lib3dsChunks.CHK_L_TARGET_NODE_TAG: break;

            default: return;
            }

            while ((chunk = lib3ds_chunk_read_next(c, io)) != 0)
            {
                switch (chunk)
                {
                case Lib3dsChunks.CHK_NODE_ID:
                    node.node_id   = lib3ds_io_read_word(io);
                    node.hasNodeID = true;
                    lib3ds_io_log_indent(io, 1);
                    lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_INFO, "ID={0}", node.node_id);
                    lib3ds_io_log_indent(io, -1);
                    break;

                case Lib3dsChunks.CHK_NODE_HDR:
                    node.name      = lib3ds_io_read_string(io, 64);
                    node.flags     = lib3ds_io_read_dword(io);
                    node.parent_id = lib3ds_io_read_word(io);

                    lib3ds_io_log_indent(io, 1);
                    lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_INFO, "NAME={0}", node.name);
                    lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_INFO, "PARENT={0}", (short)node.parent_id);
                    lib3ds_io_log_indent(io, -1);
                    break;

                case Lib3dsChunks.CHK_PIVOT:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE)
                    {
                        Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                        lib3ds_io_read_vector(io, n.pivot);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                case Lib3dsChunks.CHK_INSTANCE_NAME:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE)
                    {
                        Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                        n.instance_name = lib3ds_io_read_string(io, 64);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                case Lib3dsChunks.CHK_BOUNDBOX:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE)
                    {
                        Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                        lib3ds_io_read_vector(io, n.bbox_min);
                        lib3ds_io_read_vector(io, n.bbox_max);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                case Lib3dsChunks.CHK_COL_TRACK_TAG:
                {
                    Lib3dsTrack track = null;
                    switch (node.type)
                    {
                    case Lib3dsNodeType.LIB3DS_NODE_AMBIENT_COLOR:
                    {
                        Lib3dsAmbientColorNode n = (Lib3dsAmbientColorNode)node;
                        track = n.color_track;
                    }
                    break;

                    case Lib3dsNodeType.LIB3DS_NODE_OMNILIGHT:
                    {
                        Lib3dsOmnilightNode n = (Lib3dsOmnilightNode)node;
                        track = n.color_track;
                    }
                    break;

                    case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT:
                    {
                        Lib3dsSpotlightNode n = (Lib3dsSpotlightNode)node;
                        track = n.color_track;
                    }
                    break;

                    default: lib3ds_chunk_unknown(chunk, io); break;
                    }
                    if (track != null)
                    {
                        lib3ds_track_read(track, io);
                    }
                }
                break;

                case Lib3dsChunks.CHK_POS_TRACK_TAG:
                {
                    Lib3dsTrack track = null;
                    switch (node.type)
                    {
                    case Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE:
                    {
                        Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                        track = n.pos_track;
                    }
                    break;

                    case Lib3dsNodeType.LIB3DS_NODE_CAMERA:
                    {
                        Lib3dsCameraNode n = (Lib3dsCameraNode)node;
                        track = n.pos_track;
                    }
                    break;

                    case Lib3dsNodeType.LIB3DS_NODE_CAMERA_TARGET:
                    {
                        Lib3dsTargetNode n = (Lib3dsTargetNode)node;
                        track = n.pos_track;
                    }
                    break;

                    case Lib3dsNodeType.LIB3DS_NODE_OMNILIGHT:
                    {
                        Lib3dsOmnilightNode n = (Lib3dsOmnilightNode)node;
                        track = n.pos_track;
                    }
                    break;

                    case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT:
                    {
                        Lib3dsSpotlightNode n = (Lib3dsSpotlightNode)node;
                        track = n.pos_track;
                    }
                    break;

                    case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT_TARGET:
                    {
                        Lib3dsTargetNode n = (Lib3dsTargetNode)node;
                        track = n.pos_track;
                    }
                    break;

                    default: lib3ds_chunk_unknown(chunk, io); break;
                    }
                    if (track != null)
                    {
                        lib3ds_track_read(track, io);
                    }
                }
                break;

                case Lib3dsChunks.CHK_ROT_TRACK_TAG:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE)
                    {
                        Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                        n.rot_track.type = Lib3dsTrackType.LIB3DS_TRACK_QUAT;
                        lib3ds_track_read(n.rot_track, io);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                case Lib3dsChunks.CHK_SCL_TRACK_TAG:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE)
                    {
                        Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                        n.scl_track.type = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                        lib3ds_track_read(n.scl_track, io);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                case Lib3dsChunks.CHK_FOV_TRACK_TAG:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_CAMERA)
                    {
                        Lib3dsCameraNode n = (Lib3dsCameraNode)node;
                        n.fov_track.type = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                        lib3ds_track_read(n.fov_track, io);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                case Lib3dsChunks.CHK_HOT_TRACK_TAG:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT)
                    {
                        Lib3dsSpotlightNode n = (Lib3dsSpotlightNode)node;
                        n.hotspot_track.type = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                        lib3ds_track_read(n.hotspot_track, io);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                case Lib3dsChunks.CHK_FALL_TRACK_TAG:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT)
                    {
                        Lib3dsSpotlightNode n = (Lib3dsSpotlightNode)node;
                        n.falloff_track.type = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                        lib3ds_track_read(n.falloff_track, io);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                case Lib3dsChunks.CHK_ROLL_TRACK_TAG:
                    switch (node.type)
                    {
                    case Lib3dsNodeType.LIB3DS_NODE_CAMERA:
                    {
                        Lib3dsCameraNode n = (Lib3dsCameraNode)node;
                        n.roll_track.type = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                        lib3ds_track_read(n.roll_track, io);
                    }
                    break;

                    case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT:
                    {
                        Lib3dsSpotlightNode n = (Lib3dsSpotlightNode)node;
                        n.roll_track.type = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                        lib3ds_track_read(n.roll_track, io);
                    }
                    break;

                    default: lib3ds_chunk_unknown(chunk, io); break;
                    }
                    break;

                case Lib3dsChunks.CHK_HIDE_TRACK_TAG:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE)
                    {
                        Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                        n.hide_track.type = Lib3dsTrackType.LIB3DS_TRACK_BOOL;
                        lib3ds_track_read(n.hide_track, io);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                case Lib3dsChunks.CHK_MORPH_SMOOTH:
                    if (node.type == Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE)
                    {
                        Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                        n.morph_smooth = lib3ds_io_read_float(io);
                    }
                    else
                    {
                        lib3ds_chunk_unknown(chunk, io);
                    }
                    break;

                //case Lib3dsChunks.LIB3DS_MORPH_TRACK_TAG:
                //    if(node.type==Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE)
                //    {
                //        Lib3dsMeshInstanceNode n=(Lib3dsMeshInstanceNode)node;
                //        n.morph_track=lib3ds_track_new(node, LIB3DS_TRACK_MORPH, 0);
                //        lib3ds_track_read(n.morph_track, io);
                //    }
                //    else lib3ds_chunk_unknown(chunk, io);
                //    break;
                default: lib3ds_chunk_unknown(chunk, io); break;
                }
            }

            lib3ds_chunk_read_end(c, io);
        }
Example #7
0
        // Evaluate an animation node.
        //
        // Recursively sets node and its children to their appropriate values
        // for this point in the animation.
        //
        // \param node Node to be evaluated.
        // \param t time value, between 0. and file.frames
        public static void lib3ds_node_eval(Lib3dsNode node, float t)
        {
            Debug.Assert(node != null);
            switch (node.type)
            {
            case Lib3dsNodeType.LIB3DS_NODE_AMBIENT_COLOR:
            {
                Lib3dsAmbientColorNode n = (Lib3dsAmbientColorNode)node;
                if (node.parent != null)
                {
                    lib3ds_matrix_copy(node.matrixNode, node.parent.matrixNode);
                }
                else
                {
                    lib3ds_matrix_identity(node.matrixNode);
                }
                lib3ds_track_eval_vector(n.color_track, n.color, t);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE:
            {
                float[,] M = new float[4, 4];
                Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;

                lib3ds_track_eval_vector(n.pos_track, n.pos, t);
                lib3ds_track_eval_quat(n.rot_track, n.rot, t);
                if (n.scl_track.keys.Count != 0)
                {
                    lib3ds_track_eval_vector(n.scl_track, n.scl, t);
                }
                else
                {
                    n.scl[0] = n.scl[1] = n.scl[2] = 1.0f;
                }
                lib3ds_track_eval_bool(n.hide_track, out n.hide, t);

                lib3ds_matrix_identity(M);
                lib3ds_matrix_translate(M, n.pos[0], n.pos[1], n.pos[2]);
                lib3ds_matrix_rotate_quat(M, n.rot);
                lib3ds_matrix_scale(M, n.scl[0], n.scl[1], n.scl[2]);

                if (node.parent != null)
                {
                    lib3ds_matrix_mult(node.matrixNode, node.parent.matrixNode, M);
                }
                else
                {
                    lib3ds_matrix_copy(node.matrixNode, M);
                }
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_CAMERA:
            {
                Lib3dsCameraNode n = (Lib3dsCameraNode)node;
                lib3ds_track_eval_vector(n.pos_track, n.pos, t);
                lib3ds_track_eval_float(n.fov_track, out n.fov, t);
                lib3ds_track_eval_float(n.roll_track, out n.roll, t);
                if (node.parent != null)
                {
                    lib3ds_matrix_copy(node.matrixNode, node.parent.matrixNode);
                }
                else
                {
                    lib3ds_matrix_identity(node.matrixNode);
                }
                lib3ds_matrix_translate(node.matrixNode, n.pos[0], n.pos[1], n.pos[2]);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_CAMERA_TARGET:
            {
                Lib3dsTargetNode n = (Lib3dsTargetNode)node;
                lib3ds_track_eval_vector(n.pos_track, n.pos, t);
                if (node.parent != null)
                {
                    lib3ds_matrix_copy(node.matrixNode, node.parent.matrixNode);
                }
                else
                {
                    lib3ds_matrix_identity(node.matrixNode);
                }
                lib3ds_matrix_translate(node.matrixNode, n.pos[0], n.pos[1], n.pos[2]);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_OMNILIGHT:
            {
                Lib3dsOmnilightNode n = (Lib3dsOmnilightNode)node;
                lib3ds_track_eval_vector(n.pos_track, n.pos, t);
                lib3ds_track_eval_vector(n.color_track, n.color, t);
                if (node.parent != null)
                {
                    lib3ds_matrix_copy(node.matrixNode, node.parent.matrixNode);
                }
                else
                {
                    lib3ds_matrix_identity(node.matrixNode);
                }
                lib3ds_matrix_translate(node.matrixNode, n.pos[0], n.pos[1], n.pos[2]);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT:
            {
                Lib3dsSpotlightNode n = (Lib3dsSpotlightNode)node;
                lib3ds_track_eval_vector(n.pos_track, n.pos, t);
                lib3ds_track_eval_vector(n.color_track, n.color, t);
                lib3ds_track_eval_float(n.hotspot_track, out n.hotspot, t);
                lib3ds_track_eval_float(n.falloff_track, out n.falloff, t);
                lib3ds_track_eval_float(n.roll_track, out n.roll, t);
                if (node.parent != null)
                {
                    lib3ds_matrix_copy(node.matrixNode, node.parent.matrixNode);
                }
                else
                {
                    lib3ds_matrix_identity(node.matrixNode);
                }
                lib3ds_matrix_translate(node.matrixNode, n.pos[0], n.pos[1], n.pos[2]);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT_TARGET:
            {
                Lib3dsTargetNode n = (Lib3dsTargetNode)node;
                lib3ds_track_eval_vector(n.pos_track, n.pos, t);
                if (node.parent != null)
                {
                    lib3ds_matrix_copy(node.matrixNode, node.parent.matrixNode);
                }
                else
                {
                    lib3ds_matrix_identity(node.matrixNode);
                }
                lib3ds_matrix_translate(node.matrixNode, n.pos[0], n.pos[1], n.pos[2]);
            }
            break;
            }

            foreach (Lib3dsNode p in node.childs)
            {
                lib3ds_node_eval(p, t);
            }
        }
Example #8
0
        static void free_node_and_childs(Lib3dsNode node)
        {
            Debug.Assert(node != null);

            switch (node.type)
            {
            case Lib3dsNodeType.LIB3DS_NODE_AMBIENT_COLOR:
            {
                Lib3dsAmbientColorNode n = (Lib3dsAmbientColorNode)node;
                lib3ds_track_resize(n.color_track, 0);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE:
            {
                Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;
                lib3ds_track_resize(n.pos_track, 0);
                lib3ds_track_resize(n.rot_track, 0);
                lib3ds_track_resize(n.scl_track, 0);
                lib3ds_track_resize(n.hide_track, 0);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_CAMERA:
            {
                Lib3dsCameraNode n = (Lib3dsCameraNode)node;
                lib3ds_track_resize(n.pos_track, 0);
                lib3ds_track_resize(n.fov_track, 0);
                lib3ds_track_resize(n.roll_track, 0);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_CAMERA_TARGET:
            {
                Lib3dsTargetNode n = (Lib3dsTargetNode)node;
                lib3ds_track_resize(n.pos_track, 0);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_OMNILIGHT:
            {
                Lib3dsOmnilightNode n = (Lib3dsOmnilightNode)node;
                lib3ds_track_resize(n.pos_track, 0);
                lib3ds_track_resize(n.color_track, 0);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT:
            {
                Lib3dsSpotlightNode n = (Lib3dsSpotlightNode)node;
                lib3ds_track_resize(n.pos_track, 0);
                lib3ds_track_resize(n.color_track, 0);
                lib3ds_track_resize(n.hotspot_track, 0);
                lib3ds_track_resize(n.falloff_track, 0);
                lib3ds_track_resize(n.roll_track, 0);
            }
            break;

            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT_TARGET:
            {
                Lib3dsTargetNode n = (Lib3dsTargetNode)node;
                lib3ds_track_resize(n.pos_track, 0);
            }
            break;
            }

            foreach (Lib3dsNode p in node.childs)
            {
                free_node_and_childs(p);
            }
            node.childs.Clear();
        }
Example #9
0
        // Create and return a new node object.
        //
        // The node is returned with an identity matrix. All other fields
        // are zero.
        //
        // \return Lib3dsNode
        public static Lib3dsNode lib3ds_node_new(Lib3dsNodeType type)
        {
            Lib3dsNode node = null;

            switch (type)
            {
            case Lib3dsNodeType.LIB3DS_NODE_AMBIENT_COLOR:
            {
                Lib3dsAmbientColorNode n = new Lib3dsAmbientColorNode();
                node               = n;
                node.name          = "$AMBIENT$";
                n.color_track.type = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                break;
            }

            case Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE:
            {
                Lib3dsMeshInstanceNode n = new Lib3dsMeshInstanceNode();
                node              = n;
                node.name         = "$$$DUMMY";
                n.pos_track.type  = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                n.scl_track.type  = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                n.rot_track.type  = Lib3dsTrackType.LIB3DS_TRACK_QUAT;
                n.hide_track.type = Lib3dsTrackType.LIB3DS_TRACK_BOOL;
                break;
            }

            case Lib3dsNodeType.LIB3DS_NODE_CAMERA:
            {
                Lib3dsCameraNode n = new Lib3dsCameraNode();
                node              = n;
                n.pos_track.type  = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                n.fov_track.type  = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                n.roll_track.type = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                break;
            }

            case Lib3dsNodeType.LIB3DS_NODE_CAMERA_TARGET:
            {
                Lib3dsTargetNode n = new Lib3dsTargetNode();
                node             = n;
                n.pos_track.type = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                break;
            }

            case Lib3dsNodeType.LIB3DS_NODE_OMNILIGHT:
            {
                Lib3dsOmnilightNode n = new Lib3dsOmnilightNode();
                node               = n;
                n.pos_track.type   = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                n.color_track.type = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                break;
            }

            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT:
            {
                Lib3dsSpotlightNode n = new Lib3dsSpotlightNode();
                node                 = n;
                n.pos_track.type     = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                n.color_track.type   = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                n.hotspot_track.type = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                n.falloff_track.type = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                n.roll_track.type    = Lib3dsTrackType.LIB3DS_TRACK_FLOAT;
                break;
            }

            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT_TARGET:
            {
                Lib3dsTargetNode n = new Lib3dsTargetNode();
                node             = n;
                n.pos_track.type = Lib3dsTrackType.LIB3DS_TRACK_VECTOR;
                break;
            }

            default: Debug.Assert(false); return(null);
            }

            node.type      = type;
            node.node_id   = 65535;
            node.parent_id = 65535;
            lib3ds_matrix_identity(node.matrixNode);
            return(node);
        }
        /// <summary>
        /// Insert a new child into this object.
        /// </summary>
        /// <param name="newObj">New child</param>
        public void AddNewChild(Lib3dsMeshInstanceNode newObj)
        {
            string[] newObjectLoca = null;

            // Return if location info is illegal
            if ((newObjectLoca = GetLocation(newObj.name)) == null)
                return;

            switch (this.Type)
            {
                case BuildingObjectType.Building:
                    if (this.Childs.Contains(newObjectLoca[0]) == false)
                    {
                        BuildingObjectType childType;
                        if (newObjectLoca[0] == "0")
                        {
                            childType = BuildingObjectType.Outside;
                        }
                        else
                        {
                            childType = BuildingObjectType.Floor;
                        }

                        BuildingObjectLib3DS bObj = new BuildingObjectLib3DS(this, childType,
                            (uint)System.Convert.ToInt32(newObjectLoca[0]), Model, Textures);
                        this.Childs.Add(newObjectLoca[0], bObj);
                        bObj.AddNewChild(newObj);
                    }
                    else
                    {
                        (this.Childs[(newObjectLoca[0])] as BuildingObjectLib3DS).AddNewChild(newObj);
                    }
                    break;
                case BuildingObjectType.Floor:
                    if (this.Childs.Contains(newObjectLoca[1]) == false)
                    {
                        BuildingObjectLib3DS bObj = new BuildingObjectLib3DS(this, BuildingObjectType.Room,
                            (uint)System.Convert.ToInt32(newObjectLoca[1]), Model, Textures);
                        this.Childs.Add(newObjectLoca[1], bObj);
                        bObj.AddNewChild(newObj);
                    }
                    else
                    {
                        (this.Childs[(newObjectLoca[1])] as BuildingObjectLib3DS).AddNewChild(newObj);
                    }
                    break;
                case BuildingObjectType.Room:
                    if (this.Childs.Contains(newObjectLoca[2]) == false)
                    {
                        BuildingObjectLib3DS bObj = new BuildingObjectLib3DS(this, BuildingObjectType.Object,
                            (uint)System.Convert.ToInt32(newObjectLoca[2]), Model, Textures);
                        this.Childs.Add(newObjectLoca[2], bObj);
                        bObj.AddNewChild(newObj);
                    }
                    else
                    {
                        // Same Name... ??? Do not insert it...
                    }
                    break;
                case BuildingObjectType.Outside:
                case BuildingObjectType.Object:
                    this.Object = newObj;
                    //if (this.Object.childs.Count == 0)
                    //{
                    //    Lib3dsMesh ThisMesh = FindLib3dsMeshByName(this.Object.name, this.Model.meshes);
                    //    if (ThisMesh != null)
                    //    {
                    //        this.Normalizes = new Lib3dsVertex[1][];
                    //        this.Normalizes[0] = new Lib3dsVertex[ThisMesh.faces.Count];
                    //        for (int i = 0; i < ThisMesh.faces.Count; i++)
                    //        {
                    //            Lib3dsFace face = ThisMesh.faces[i];
                    //            Lib3dsVertex Point1 = ThisMesh.vertices[face.index[0]];
                    //            Lib3dsVertex Point2 = ThisMesh.vertices[face.index[1]];
                    //            Lib3dsVertex Point3 = ThisMesh.vertices[face.index[2]];
                    //            this.Normalizes[0][i] = CreateNormalize(Point1, Point2, Point3);
                    //        }
                    //    }
                    //}
                    //else
                    //{
                    //    this.Normalizes = new Lib3dsVertex[newObj.childs.Count][];
                    //    int cnt = 0;
                    //    foreach (Lib3dsNode node in newObj.childs)
                    //    {
                    //        Lib3dsMesh ThisMesh = FindLib3dsMeshByName(node.name, this.Model.meshes);
                    //        if (ThisMesh == null)
                    //        {
                    //            continue;
                    //        }

                    //        this.Normalizes[cnt] = new Lib3dsVertex[ThisMesh.faces.Count];

                    //        for (int i = 0; i < ThisMesh.faces.Count; i++)
                    //        {
                    //            Lib3dsFace face = ThisMesh.faces[i];
                    //            Lib3dsVertex Point1 = ThisMesh.vertices[face.index[0]];
                    //            Lib3dsVertex Point2 = ThisMesh.vertices[face.index[1]];
                    //            Lib3dsVertex Point3 = ThisMesh.vertices[face.index[2]];
                    //            this.Normalizes[cnt][i] = CreateNormalize(Point1, Point2, Point3);
                    //        }
                    //        cnt++;
                    //    }
                    //}
                    break;
                default:
                    break;
            }
        }
Example #11
0
        static void file_bounding_box_of_nodes_impl(Lib3dsNode node, Lib3dsFile file, bool include_meshes, bool include_cameras, bool include_lights, float[] bmin, float[] bmax, float[,] matrix)
        {
            switch (node.type)
            {
            case Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE:
                if (include_meshes)
                {
                    Lib3dsMeshInstanceNode n = (Lib3dsMeshInstanceNode)node;

                    int index = lib3ds_file_mesh_by_name(file, n.instance_name);
                    if (index < 0)
                    {
                        index = lib3ds_file_mesh_by_name(file, node.name);
                    }
                    if (index >= 0)
                    {
                        float[,] inv_matrix = new float[4, 4], M = new float[4, 4];
                        float[] v = new float[3];

                        Lib3dsMesh mesh = file.meshes[index];
                        lib3ds_matrix_copy(inv_matrix, mesh.matrix);
                        lib3ds_matrix_inv(inv_matrix);
                        lib3ds_matrix_mult(M, matrix, node.matrixNode);
                        lib3ds_matrix_translate(M, -n.pivot[0], -n.pivot[1], -n.pivot[2]);
                        lib3ds_matrix_mult(M, M, inv_matrix);

                        foreach (Lib3dsVertex vertex in mesh.vertices)
                        {
                            lib3ds_vector_transform(v, M, vertex);
                            lib3ds_vector_min(bmin, v);
                            lib3ds_vector_max(bmax, v);
                        }
                    }
                }
                break;

            case Lib3dsNodeType.LIB3DS_NODE_CAMERA:
            case Lib3dsNodeType.LIB3DS_NODE_CAMERA_TARGET:
                if (include_cameras)
                {
                    float[] z = new float[3], v = new float[3];
                    float[,] M = new float[4, 4];
                    lib3ds_matrix_mult(M, matrix, node.matrixNode);
                    lib3ds_vector_zero(z);
                    lib3ds_vector_transform(v, M, z);
                    lib3ds_vector_min(bmin, v);
                    lib3ds_vector_max(bmax, v);
                }
                break;

            case Lib3dsNodeType.LIB3DS_NODE_OMNILIGHT:
            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT:
            case Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT_TARGET:
                if (include_lights)
                {
                    float[] z = new float[3], v = new float[3];
                    float[,] M = new float[4, 4];
                    lib3ds_matrix_mult(M, matrix, node.matrixNode);
                    lib3ds_vector_zero(z);
                    lib3ds_vector_transform(v, M, z);
                    lib3ds_vector_min(bmin, v);
                    lib3ds_vector_max(bmax, v);
                }
                break;
            }

            foreach (Lib3dsNode p in node.childs)
            {
                file_bounding_box_of_nodes_impl(p, file, include_meshes, include_cameras, include_lights, bmin, bmax, matrix);
            }
        }
Example #12
0
		static void write_mesh(StreamWriter o, Lib3dsFile f, Lib3dsMeshInstanceNode node)
		{
			Lib3dsMesh mesh=LIB3DS.lib3ds_file_mesh_for_node(f, node);
			if(mesh==null||mesh.vertices==null||mesh.vertices.Count==0) return;

			o.WriteLine("# object {0}", node.name);
			o.WriteLine("g {0}", node.instance_name!=null&&node.instance_name.Length!=0?node.instance_name:node.name);

			List<Lib3dsVertex> orig_vertices=new List<Lib3dsVertex>();
			foreach(Lib3dsVertex v in mesh.vertices) orig_vertices.Add(new Lib3dsVertex(v));

			float[,] inv_matrix=new float[4, 4], M=new float[4, 4];
			float[] tmp=new float[3];

			LIB3DS.lib3ds_matrix_copy(M, node.matrixNode);
			LIB3DS.lib3ds_matrix_translate(M, -node.pivot[0], -node.pivot[1], -node.pivot[2]);
			LIB3DS.lib3ds_matrix_copy(inv_matrix, mesh.matrix);
			LIB3DS.lib3ds_matrix_inv(inv_matrix);
			LIB3DS.lib3ds_matrix_mult(M, M, inv_matrix);

			for(int i=0; i<mesh.nvertices; i++)
			{
				LIB3DS.lib3ds_vector_transform(tmp, M, mesh.vertices[i]);
				LIB3DS.lib3ds_vector_copy(mesh.vertices[i], tmp);
			}

			bool export_texcos=mesh.texcos!=null;
			bool export_normals=mesh.faces!=null;

			foreach(Lib3dsVertex v in mesh.vertices) o.WriteLine("v {0} {1} {2}", v.x, v.y, v.z);
			o.WriteLine("# {0} vertices", mesh.vertices.Count);

			if(export_texcos)
			{
				foreach(Lib3dsTexturecoordinate vt in mesh.texcos) o.WriteLine("vt {0} {1}", vt.s, vt.t);
				o.WriteLine("# {0} texture vertices", mesh.vertices.Count);
			}

			if(export_normals)
			{
				float[][] normals=new float[3*mesh.nfaces][];
				for(int i=0; i<3*mesh.nfaces; i++) normals[i]=new float[3];
				LIB3DS.lib3ds_mesh_calculate_vertex_normals(mesh, normals);
				for(int i=0; i<3*mesh.nfaces; i++) o.WriteLine("vn {0} {1} {2}", normals[i][0], normals[i][1], normals[i][2]);
				o.WriteLine("# {0} normals", 3*mesh.nfaces);
			}

			int mat_index=-1;
			for(int i=0; i<mesh.nfaces; i++)
			{
				if(mat_index!=mesh.faces[i].material)
				{
					mat_index=mesh.faces[i].material;
					if(mat_index!=-1) o.WriteLine("usemtl {0}", f.materials[mat_index].name);
				}

				o.Write("f ");
				for(int j=0; j<3; ++j)
				{
					o.Write("{0}", mesh.faces[i].index[j]+max_vertices+1);
					if(export_texcos) o.Write("/{0}", mesh.faces[i].index[j]+max_texcos+1);
					else if(export_normals) o.Write("/");
					if(export_normals) o.Write("/{0}", 3*i+j+max_normals+1);
					if(j<3) o.Write(" ");
				}
				o.WriteLine();
			}

			max_vertices+=mesh.nvertices;
			if(export_texcos) max_texcos+=mesh.nvertices;
			if(export_normals) max_normals+=3*mesh.nfaces;

			mesh.vertices=orig_vertices;
		}