Ejemplo n.º 1
0
 // Read a signed dword a from file stream in little endian format.
 static int lib3ds_io_read_intd(Lib3dsIo io)
 {
     Debug.Assert(io != null);
     byte[] b = new byte[4];
     lib3ds_io_read(io, b, 4);
     return((int)((b[3] << 23) | (b[2] << 16) | (b[1] << 8) | b[0]));
 }
Ejemplo n.º 2
0
 // Read a vector from a file stream in little endian format.
 //
 // \param io IO input handle.
 // \param v  The vector to store the data.
 static void lib3ds_io_read_vector(Lib3dsIo io, float[] v)
 {
     Debug.Assert(io != null);
     v[0] = lib3ds_io_read_float(io);
     v[1] = lib3ds_io_read_float(io);
     v[2] = lib3ds_io_read_float(io);
 }
Ejemplo n.º 3
0
 // Writes a vector into a file stream in little endian format.
 static void lib3ds_io_write_vector(Lib3dsIo io, float[] v)
 {
     for (int i = 0; i < 3; i++)
     {
         lib3ds_io_write_float(io, v[i]);
     }
 }
Ejemplo n.º 4
0
 // Read a signed byte from a file stream.
 static sbyte lib3ds_io_read_intb(Lib3dsIo io)
 {
     Debug.Assert(io != null);
     byte[] b = new byte[1];
     lib3ds_io_read(io, b, 1);
     return((sbyte)b[0]);
 }
Ejemplo n.º 5
0
 // Read a signed word from a file stream in little endian format.
 static short lib3ds_io_read_intw(Lib3dsIo io)
 {
     Debug.Assert(io != null);
     byte[] b = new byte[2];
     lib3ds_io_read(io, b, 2);
     return((short)((b[1] << 8) | b[0]));
 }
Ejemplo n.º 6
0
		// Read a camera definition from a file.
		//
		// This function is called by lib3ds_file_read(), and you probably
		// don't want to call it directly.
		//
		// \param camera A Lib3dsCamera to be filled in.
		// \param io A Lib3dsIo object previously set up by the caller.
		//
		// \see lib3ds_file_read
		public static void lib3ds_camera_read(Lib3dsCamera camera, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();
			Lib3dsChunks chunk;

			lib3ds_chunk_read_start(c, Lib3dsChunks.CHK_N_CAMERA, io);

			for(int i=0; i<3; i++) camera.position[i]=lib3ds_io_read_float(io);
			for(int i=0; i<3; i++) camera.target[i]=lib3ds_io_read_float(io);
			camera.roll=lib3ds_io_read_float(io);

			float s=lib3ds_io_read_float(io);
			if(Math.Abs(s)<EPSILON) camera.fov=45.0f;
			else camera.fov=2400.0f/s;

			lib3ds_chunk_read_tell(c, io);

			while((chunk=lib3ds_chunk_read_next(c, io))!=0)
			{
				switch(chunk)
				{
					case Lib3dsChunks.CHK_CAM_SEE_CONE: camera.see_cone=true; break;
					case Lib3dsChunks.CHK_CAM_RANGES:
						camera.near_range=lib3ds_io_read_float(io);
						camera.far_range=lib3ds_io_read_float(io);
						break;
					default: lib3ds_chunk_unknown(chunk, io); break;
				}
			}

			lib3ds_chunk_read_end(c, io);
		}
Ejemplo n.º 7
0
 // Read a byte from a file stream.
 static byte lib3ds_io_read_byte(Lib3dsIo io)
 {
     Debug.Assert(io != null);
     byte[] b = new byte[1];
     lib3ds_io_read(io, b, 1);
     return(b[0]);
 }
Ejemplo n.º 8
0
 static void lib3ds_io_read_vector(Lib3dsIo io, Lib3dsVertex v)
 {
     Debug.Assert(io != null);
     v.x = lib3ds_io_read_float(io);
     v.y = lib3ds_io_read_float(io);
     v.z = lib3ds_io_read_float(io);
 }
Ejemplo n.º 9
0
        // Read a zero-terminated string from a file stream.
        static string lib3ds_io_read_string(Lib3dsIo io, int buflen)
        {
            Debug.Assert(io != null);
            byte[] c = new byte[1];

            string s = "";

            int k = 0;

            for (; ;)
            {
                if (lib3ds_io_read(io, c, 1) != 1)
                {
                    lib3ds_io_read_error(io);
                }
                if (c[0] == 0)
                {
                    break;
                }

                s += (char)c[0];

                k++;
                if (k >= buflen)
                {
                    lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_ERROR, "Invalid string in input stream.");
                }
            }

            return(s);
        }
Ejemplo n.º 10
0
		// Read a byte from a file stream.
		static byte lib3ds_io_read_byte(Lib3dsIo io)
		{
			Debug.Assert(io!=null);
			byte[] b=new byte[1];
			lib3ds_io_read(io, b, 1);
			return b[0];
		}
Ejemplo n.º 11
0
        static Lib3dsChunks lib3ds_chunk_read_next(Lib3dsChunk c, Lib3dsIo io)
        {
            Lib3dsChunk d = new Lib3dsChunk();

            if (c.cur >= c.end)
            {
                Debug.Assert(c.cur == c.end);
                return(0);
            }

            lib3ds_io_seek(io, (long)c.cur, Lib3dsIoSeek.LIB3DS_SEEK_SET);
            d.chunk = (Lib3dsChunks)lib3ds_io_read_word(io);
            d.size  = lib3ds_io_read_dword(io);
            c.cur  += d.size;

            if (io.log_func != null)
            {
                lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_INFO, "{0} (0x{1:X}) size={2}", lib3ds_chunk_name(d.chunk), d.chunk, d.size);
            }

            if (c.cur > c.end)
            {
                if (io.log_func != null)
                {
                    lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_WARN, "***STOPPED READING - INVALID CHUNK SIZE***");
                }
                return(0);
            }

            return(d.chunk);
        }
Ejemplo n.º 12
0
        // Saves a .3DS file from memory to disk.
        //
        // \param file		A pointer to a Lib3dsFile structure containing the
        //					the data that should be stored.
        // \param filename	The filename of the .3DS file to store the data in.
        //
        // \return			true on success, false otherwise.
        //
        // \see lib3ds_file_open
        public static bool lib3ds_file_save(Lib3dsFile file, string filename)
        {
            try
            {
                FileStream f = File.Create(filename);

                try
                {
                    Lib3dsIo io = new Lib3dsIo();
                    io.self       = f;
                    io.seek_func  = fileio_seek_func;
                    io.tell_func  = fileio_tell_func;
                    io.read_func  = fileio_read_func;
                    io.write_func = fileio_write_func;
                    io.log_func   = null;

                    return(lib3ds_file_write(file, io));
                }
                finally
                {
                    f.Close();
                }
            }
            catch
            {
                return(false);
            }
        }
Ejemplo n.º 13
0
		static void lib3ds_io_log(Lib3dsIo io, Lib3dsLogLevel level, string format, params object[] args)
		{
			Debug.Assert(io!=null);
			if(io==null||io.log_func==null) return;
			lib3ds_io_log_str(io, level, string.Format(format, args));
			if(level==Lib3dsLogLevel.LIB3DS_LOG_ERROR) throw new Exception();
		}
Ejemplo n.º 14
0
 static void lib3ds_chunk_unknown(Lib3dsChunks chunk, Lib3dsIo io)
 {
     if (io.log_func != null)
     {
         lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_WARN, "Unknown Chunk: {0} (0x{1:X})", lib3ds_chunk_name(chunk), chunk);
     }
 }
Ejemplo n.º 15
0
        static void solid_bgnd_read(Lib3dsBackground background, Lib3dsIo io)
        {
            Lib3dsChunk  c = new Lib3dsChunk();
            Lib3dsChunks chunk;
            bool         have_lin = false;

            lib3ds_chunk_read_start(c, Lib3dsChunks.CHK_SOLID_BGND, io);

            while ((chunk = lib3ds_chunk_read_next(c, io)) != 0)
            {
                switch (chunk)
                {
                case Lib3dsChunks.CHK_LIN_COLOR_F:
                    lib3ds_io_read_rgb(io, background.solid_color);
                    have_lin = true;
                    break;

                case Lib3dsChunks.CHK_COLOR_F:
                    lib3ds_io_read_rgb(io, background.solid_color);
                    break;

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

            lib3ds_chunk_read_end(c, io);
        }
Ejemplo n.º 16
0
        public static void lib3ds_background_read(Lib3dsBackground background, Lib3dsIo io)
        {
            Lib3dsChunk c = new Lib3dsChunk();

            lib3ds_chunk_read(c, io);
            switch (c.chunk)
            {
            case Lib3dsChunks.CHK_BIT_MAP: background.bitmap_name = lib3ds_io_read_string(io, 64); break;

            case Lib3dsChunks.CHK_SOLID_BGND:
                lib3ds_chunk_read_reset(c, io);
                solid_bgnd_read(background, io);
                break;

            case Lib3dsChunks.CHK_V_GRADIENT:
                lib3ds_chunk_read_reset(c, io);
                v_gradient_read(background, io);
                break;

            case Lib3dsChunks.CHK_USE_BIT_MAP: background.use_bitmap = true; break;

            case Lib3dsChunks.CHK_USE_SOLID_BGND: background.use_solid = true; break;

            case Lib3dsChunks.CHK_USE_V_GRADIENT: background.use_gradient = true; break;
            }
        }
Ejemplo n.º 17
0
        // Write 3ds file data from a Lib3dsFile object to a file.
        //
        // \param file The Lib3dsFile object to be written.
        // \param io A Lib3dsIo object previously set up by the caller.
        //
        // \return true on success, false on failure.
        public static bool lib3ds_file_write(Lib3dsFile file, Lib3dsIo io)
        {
            Lib3dsChunk c = new Lib3dsChunk();

            lib3ds_io_setup(io);

            try
            {
                c.chunk = Lib3dsChunks.CHK_M3DMAGIC;
                lib3ds_chunk_write_start(c, io);

                // ---- LIB3DS_M3D_VERSION ----
                Lib3dsChunk c_version = new Lib3dsChunk();
                c_version.chunk = Lib3dsChunks.CHK_M3D_VERSION;
                c_version.size  = 10;
                lib3ds_chunk_write(c_version, io);
                lib3ds_io_write_dword(io, file.mesh_version);

                mdata_write(file, io);
                kfdata_write(file, io);

                lib3ds_chunk_write_end(c, io);

                lib3ds_io_cleanup(io);
                return(true);
            }
            catch
            {
                lib3ds_io_cleanup(io);
                return(false);
            }
        }
Ejemplo n.º 18
0
 static void lib3ds_io_write_rgb(Lib3dsIo io, float[] rgb)
 {
     for (int i = 0; i < 3; i++)
     {
         lib3ds_io_write_float(io, rgb[i]);
     }
 }
Ejemplo n.º 19
0
		public static void lib3ds_light_read(Lib3dsLight light, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();
			Lib3dsChunks chunk;

			lib3ds_chunk_read_start(c, Lib3dsChunks.CHK_N_DIRECT_LIGHT, io);

			for(int i=0; i<3; i++) light.position[i]=lib3ds_io_read_float(io);
			lib3ds_chunk_read_tell(c, io);

			while((chunk=lib3ds_chunk_read_next(c, io))!=0)
			{
				switch(chunk)
				{
					case Lib3dsChunks.CHK_COLOR_F:
						for(int i=0; i<3; i++) light.color[i]=lib3ds_io_read_float(io);
						break;
					case Lib3dsChunks.CHK_DL_OFF: light.off=true; break;
					case Lib3dsChunks.CHK_DL_OUTER_RANGE: light.outer_range=lib3ds_io_read_float(io); break;
					case Lib3dsChunks.CHK_DL_INNER_RANGE: light.inner_range=lib3ds_io_read_float(io); break;
					case Lib3dsChunks.CHK_DL_MULTIPLIER: light.multiplier=lib3ds_io_read_float(io); break;
					case Lib3dsChunks.CHK_DL_EXCLUDE: lib3ds_chunk_unknown(chunk, io); break; // FIXME:
					case Lib3dsChunks.CHK_DL_ATTENUATE: light.attenuation=lib3ds_io_read_float(io); break;
					case Lib3dsChunks.CHK_DL_SPOTLIGHT: lib3ds_chunk_read_reset(c, io); spotlight_read(light, io); break;
					default: lib3ds_chunk_unknown(chunk, io); break;
				}
			}

			lib3ds_chunk_read_end(c, io);
		}
Ejemplo n.º 20
0
		static Lib3dsChunks lib3ds_chunk_read_next(Lib3dsChunk c, Lib3dsIo io)
		{
			Lib3dsChunk d=new Lib3dsChunk();

			if(c.cur>=c.end)
			{
				Debug.Assert(c.cur==c.end);
				return 0;
			}

			lib3ds_io_seek(io, (long)c.cur, Lib3dsIoSeek.LIB3DS_SEEK_SET);
			d.chunk=(Lib3dsChunks)lib3ds_io_read_word(io);
			d.size=lib3ds_io_read_dword(io);
			c.cur+=d.size;

			if(io.log_func!=null)
			{
				lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_INFO, "{0} (0x{1:X}) size={2}", lib3ds_chunk_name(d.chunk), d.chunk, d.size);
			}

			if(c.cur>c.end)
			{
				if(io.log_func!=null)
				{
					lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_WARN, "***STOPPED READING - INVALID CHUNK SIZE***");
				}
				return 0;
			}

			return d.chunk;
		}
Ejemplo n.º 21
0
 static void lib3ds_io_read_rgb(Lib3dsIo io, float[] rgb)
 {
     Debug.Assert(io != null);
     rgb[0] = lib3ds_io_read_float(io);
     rgb[1] = lib3ds_io_read_float(io);
     rgb[2] = lib3ds_io_read_float(io);
 }
Ejemplo n.º 22
0
 // Read a float from a file stream in little endian format.
 static float lib3ds_io_read_float(Lib3dsIo io)
 {
     Debug.Assert(io != null);
     byte[] b = new byte[4];
     lib3ds_io_read(io, b, 4);
     return(BitConverter.ToSingle(b, 0));
 }
Ejemplo n.º 23
0
        // Read 3ds file data into a Lib3dsFile object.
        //
        // \param file The Lib3dsFile object to be filled.
        // \param io A Lib3dsIo object previously set up by the caller.
        //
        // \return true on success, false on failure.
        public static bool lib3ds_file_read(Lib3dsFile file, Lib3dsIo io)
        {
            Lib3dsChunk  c = new Lib3dsChunk();
            Lib3dsChunks chunk;

            lib3ds_io_setup(io);

            try
            {
                lib3ds_chunk_read_start(c, 0, io);

                switch (c.chunk)
                {
                case Lib3dsChunks.CHK_MDATA:
                    lib3ds_chunk_read_reset(c, io);
                    mdata_read(file, io);
                    break;

                case Lib3dsChunks.CHK_M3DMAGIC:
                case Lib3dsChunks.CHK_MLIBMAGIC:
                case Lib3dsChunks.CHK_CMAGIC:
                    while ((chunk = lib3ds_chunk_read_next(c, io)) != 0)
                    {
                        switch (chunk)
                        {
                        case Lib3dsChunks.CHK_M3D_VERSION:
                            file.mesh_version = lib3ds_io_read_dword(io);
                            break;

                        case Lib3dsChunks.CHK_MDATA:
                            lib3ds_chunk_read_reset(c, io);
                            mdata_read(file, io);
                            break;

                        case Lib3dsChunks.CHK_KFDATA:
                            lib3ds_chunk_read_reset(c, io);
                            kfdata_read(file, io);
                            break;

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

                default:
                    lib3ds_chunk_unknown(c.chunk, io);
                    return(false);
                }

                lib3ds_chunk_read_end(c, io);
                lib3ds_io_cleanup(io);
                return(true);
            }
            catch
            {
                lib3ds_io_cleanup(io);
                return(false);
            }
        }
Ejemplo n.º 24
0
		static void lib3ds_chunk_read_start(Lib3dsChunk c, Lib3dsChunks chunk, Lib3dsIo io)
		{
			Debug.Assert(c!=null);
			Debug.Assert(io!=null);
			lib3ds_chunk_read(c, io);
			if((chunk!=0)&&(c.chunk!=chunk)) lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_ERROR, "Unexpected chunk found.");
			io.log_indent++;
		}
Ejemplo n.º 25
0
 static void lib3ds_chunk_write_start(Lib3dsChunk c, Lib3dsIo io)
 {
     Debug.Assert(c != null);
     c.size = 0;
     c.cur  = (uint)lib3ds_io_tell(io);
     lib3ds_io_write_word(io, (ushort)c.chunk);
     lib3ds_io_write_dword(io, c.size);
 }
Ejemplo n.º 26
0
 // Writes a float into a little endian file stream.
 static void lib3ds_io_write_float(Lib3dsIo io, float l)
 {
     Debug.Assert(io != null);
     if (lib3ds_io_write(io, BitConverter.GetBytes(l), 4) != 4)
     {
         lib3ds_io_write_error(io);
     }
 }
Ejemplo n.º 27
0
        public static void lib3ds_background_write(Lib3dsBackground background, Lib3dsIo io)
        {
            if (background.bitmap_name.Length > 0)
            {             // ---- LIB3DS_BIT_MAP ----
                Lib3dsChunk c = new Lib3dsChunk();
                c.chunk = Lib3dsChunks.CHK_BIT_MAP;
                c.size  = 6 + 1 + (uint)background.bitmap_name.Length;
                lib3ds_chunk_write(c, io);
                lib3ds_io_write_string(io, background.bitmap_name);
            }

            if (colorf_defined(background.solid_color))
            {             // ---- LIB3DS_SOLID_BGND ----
                Lib3dsChunk c = new Lib3dsChunk();
                c.chunk = Lib3dsChunks.CHK_SOLID_BGND;
                c.size  = 42;
                lib3ds_chunk_write(c, io);
                colorf_write(background.solid_color, io);
            }

            if (colorf_defined(background.gradient_top) ||
                colorf_defined(background.gradient_middle) ||
                colorf_defined(background.gradient_bottom))
            {             // ---- LIB3DS_V_GRADIENT ----
                Lib3dsChunk c = new Lib3dsChunk();
                c.chunk = Lib3dsChunks.CHK_V_GRADIENT;
                c.size  = 118;
                lib3ds_chunk_write(c, io);
                lib3ds_io_write_float(io, background.gradient_percent);
                colorf_write(background.gradient_top, io);
                colorf_write(background.gradient_middle, io);
                colorf_write(background.gradient_bottom, io);
            }

            if (background.use_bitmap)
            {             // ---- LIB3DS_USE_BIT_MAP ----
                Lib3dsChunk c = new Lib3dsChunk();
                c.chunk = Lib3dsChunks.CHK_USE_BIT_MAP;
                c.size  = 6;
                lib3ds_chunk_write(c, io);
            }

            if (background.use_solid)
            {             // ---- LIB3DS_USE_SOLID_BGND ----
                Lib3dsChunk c = new Lib3dsChunk();
                c.chunk = Lib3dsChunks.CHK_USE_SOLID_BGND;
                c.size  = 6;
                lib3ds_chunk_write(c, io);
            }

            if (background.use_gradient)
            {             // ---- LIB3DS_USE_V_GRADIENT ----
                Lib3dsChunk c = new Lib3dsChunk();
                c.chunk = Lib3dsChunks.CHK_USE_V_GRADIENT;
                c.size  = 6;
                lib3ds_chunk_write(c, io);
            }
        }
Ejemplo n.º 28
0
        static void v_gradient_read(Lib3dsBackground background, Lib3dsIo io)
        {
            Lib3dsChunk  c = new Lib3dsChunk();
            Lib3dsChunks chunk;

            List <float[]> color     = new List <float[]>();
            List <float[]> lin_color = new List <float[]>();
            bool           have_lin  = false;

            lib3ds_chunk_read_start(c, Lib3dsChunks.CHK_V_GRADIENT, io);

            background.gradient_percent = lib3ds_io_read_float(io);
            lib3ds_chunk_read_tell(c, io);

            while ((chunk = lib3ds_chunk_read_next(c, io)) != 0)
            {
                switch (chunk)
                {
                case Lib3dsChunks.CHK_COLOR_F:
                {
                    float[] col = new float[3];
                    lib3ds_io_read_rgb(io, col);
                    color.Add(col);
                }
                break;

                case Lib3dsChunks.CHK_LIN_COLOR_F:
                {
                    float[] col = new float[3];
                    lib3ds_io_read_rgb(io, col);
                    lin_color.Add(col);
                    have_lin = true;
                }
                break;

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

            if (have_lin)
            {
                color = lin_color;
            }

            while (color.Count < 3)
            {
                color.Add(new float[3]);
            }

            for (int i = 0; i < 3; i++)
            {
                background.gradient_top[i]    = color[0][i];
                background.gradient_middle[i] = color[1][i];
                background.gradient_bottom[i] = color[2][i];
            }

            lib3ds_chunk_read_end(c, io);
        }
Ejemplo n.º 29
0
        static void int_percentage_write(float p, Lib3dsIo io)
        {
            Lib3dsChunk c = new Lib3dsChunk();

            c.chunk = Lib3dsChunks.CHK_INT_PERCENTAGE;
            c.size  = 8;
            lib3ds_chunk_write(c, io);
            lib3ds_io_write_intw(io, (byte)Math.Floor(100.0 * p + 0.5));
        }
Ejemplo n.º 30
0
 static void lib3ds_io_log_str(Lib3dsIo io, Lib3dsLogLevel level, string str)
 {
     Debug.Assert(io != null);
     if (io == null || io.log_func == null)
     {
         return;
     }
     io.log_func(io.self, level, io.log_indent, str);
 }
Ejemplo n.º 31
0
 static int lib3ds_io_write(Lib3dsIo io, byte[] buffer, int size)
 {
     Debug.Assert(io != null);
     if (io == null || io.write_func == null)
     {
         return(0);
     }
     return(io.write_func(io.self, buffer, size));
 }
Ejemplo n.º 32
0
 static long lib3ds_io_tell(Lib3dsIo io)
 {
     Debug.Assert(io != null);
     if (io == null || io.tell_func == null)
     {
         return(0);
     }
     return(io.tell_func(io.self));
 }
Ejemplo n.º 33
0
 static void lib3ds_chunk_write_end(Lib3dsChunk c, Lib3dsIo io)
 {
     Debug.Assert(c != null);
     c.size = (uint)lib3ds_io_tell(io) - c.cur;
     lib3ds_io_seek(io, c.cur + 2, Lib3dsIoSeek.LIB3DS_SEEK_SET);
     lib3ds_io_write_dword(io, c.size);
     c.cur += c.size;
     lib3ds_io_seek(io, c.cur, Lib3dsIoSeek.LIB3DS_SEEK_SET);
 }
Ejemplo n.º 34
0
 static long lib3ds_io_seek(Lib3dsIo io, long offset, Lib3dsIoSeek origin)
 {
     Debug.Assert(io != null);
     if (io == null || io.seek_func == null)
     {
         return(0);
     }
     return(io.seek_func(io.self, offset, origin));
 }
Ejemplo n.º 35
0
 static void lib3ds_io_log_indent(Lib3dsIo io, int indent)
 {
     Debug.Assert(io != null);
     if (io == null)
     {
         return;
     }
     io.log_indent += indent;
 }
Ejemplo n.º 36
0
        static void color_read(float[] rgb, Lib3dsIo io)
        {
            Lib3dsChunk  c = new Lib3dsChunk();
            Lib3dsChunks chunk;
            bool         have_lin = false;

            lib3ds_chunk_read_start(c, 0, io);

            while ((chunk = lib3ds_chunk_read_next(c, io)) != 0)
            {
                switch (chunk)
                {
                case Lib3dsChunks.CHK_LIN_COLOR_24:
                    for (int i = 0; i < 3; i++)
                    {
                        rgb[i] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
                    }
                    have_lin = true;
                    break;

                case Lib3dsChunks.CHK_COLOR_24:
                    // gamma corrected color chunk
                    // replaced in 3ds R3 by LIN_COLOR_24
                    if (!have_lin)
                    {
                        for (int i = 0; i < 3; i++)
                        {
                            rgb[i] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
                        }
                    }
                    break;

                case Lib3dsChunks.CHK_LIN_COLOR_F:
                    for (int i = 0; i < 3; i++)
                    {
                        rgb[i] = lib3ds_io_read_float(io);
                    }
                    have_lin = true;
                    break;

                case Lib3dsChunks.CHK_COLOR_F:
                    if (!have_lin)
                    {
                        for (int i = 0; i < 3; i++)
                        {
                            rgb[i] = lib3ds_io_read_float(io);
                        }
                    }
                    break;

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

            lib3ds_chunk_read_end(c, io);
        }
Ejemplo n.º 37
0
		// Reads a 3d-Studio chunk header from a little endian file stream.
		//
		// \param c  The chunk to store the data.
		// \param io The file stream.
		static void lib3ds_chunk_read(Lib3dsChunk c, Lib3dsIo io)
		{
			Debug.Assert(c!=null);
			Debug.Assert(io!=null);
			c.cur=(uint)lib3ds_io_tell(io);
			c.chunk=(Lib3dsChunks)lib3ds_io_read_word(io);
			c.size=lib3ds_io_read_dword(io);
			c.end=c.cur+c.size;
			c.cur+=6;
			if(c.size<6) lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_ERROR, "Invalid chunk header.");
		}
Ejemplo n.º 38
0
		public static void lib3ds_shadow_read(Lib3dsShadow shadow, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();

			lib3ds_chunk_read(c, io);
			switch(c.chunk)
			{
				case Lib3dsChunks.CHK_SHADOW_MAP_SIZE: shadow.map_size=lib3ds_io_read_intw(io); break;
				case Lib3dsChunks.CHK_LO_SHADOW_BIAS: shadow.low_bias=lib3ds_io_read_float(io); break;
				case Lib3dsChunks.CHK_HI_SHADOW_BIAS: shadow.hi_bias=lib3ds_io_read_float(io); break;
				case Lib3dsChunks.CHK_SHADOW_FILTER: shadow.filter=lib3ds_io_read_float(io); break;
				case Lib3dsChunks.CHK_RAY_BIAS: shadow.ray_bias=lib3ds_io_read_float(io); break;
			}
		}
Ejemplo n.º 39
0
		public static void lib3ds_shadow_write(Lib3dsShadow shadow, Lib3dsIo io)
		{
			if(Math.Abs(shadow.low_bias)>EPSILON)
			{ // ---- CHK_LO_SHADOW_BIAS ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_LO_SHADOW_BIAS;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_float(io, shadow.low_bias);
			}

			if(Math.Abs(shadow.hi_bias)>EPSILON)
			{ // ---- CHK_HI_SHADOW_BIAS ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_HI_SHADOW_BIAS;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_float(io, shadow.hi_bias);
			}

			if(shadow.map_size!=0)
			{ // ---- CHK_SHADOW_MAP_SIZE ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_SHADOW_MAP_SIZE;
				c.size=8;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_intw(io, shadow.map_size);
			}

			if(Math.Abs(shadow.filter)>EPSILON)
			{ // ---- CHK_SHADOW_FILTER ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_SHADOW_FILTER;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_float(io, shadow.filter);
			}
			if(Math.Abs(shadow.ray_bias)>EPSILON)
			{ // ---- CHK_RAY_BIAS ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_RAY_BIAS;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_float(io, shadow.ray_bias);
			}
		}
Ejemplo n.º 40
0
		static void color_read(float[] rgb, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();
			Lib3dsChunks chunk;
			bool have_lin=false;

			lib3ds_chunk_read_start(c, 0, io);

			while((chunk=lib3ds_chunk_read_next(c, io))!=0)
			{
				switch(chunk)
				{
					case Lib3dsChunks.CHK_LIN_COLOR_24:
						for(int i=0; i<3; i++) rgb[i]=1.0f*lib3ds_io_read_byte(io)/255.0f;
						have_lin=true;
						break;
					case Lib3dsChunks.CHK_COLOR_24:
						// gamma corrected color chunk
						// replaced in 3ds R3 by LIN_COLOR_24
						if(!have_lin)
						{
							for(int i=0; i<3; i++) rgb[i]=1.0f*lib3ds_io_read_byte(io)/255.0f;
						}
						break;
					case Lib3dsChunks.CHK_LIN_COLOR_F:
						for(int i=0; i<3; i++) rgb[i]=lib3ds_io_read_float(io);
						have_lin=true;
						break;
					case Lib3dsChunks.CHK_COLOR_F:
						if(!have_lin)
						{
							for(int i=0; i<3; i++) rgb[i]=lib3ds_io_read_float(io);
						}
						break;
					default: lib3ds_chunk_unknown(chunk, io); break;
				}
			}

			lib3ds_chunk_read_end(c, io);
		}
Ejemplo n.º 41
0
		static void spotlight_read(Lib3dsLight light, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();
			Lib3dsChunks chunk;

			lib3ds_chunk_read_start(c, Lib3dsChunks.CHK_DL_SPOTLIGHT, io);

			light.spot_light=true;
			for(int i=0; i<3; i++) light.target[i]=lib3ds_io_read_float(io);
			light.hotspot=lib3ds_io_read_float(io);
			light.falloff=lib3ds_io_read_float(io);
			lib3ds_chunk_read_tell(c, io);

			while((chunk=lib3ds_chunk_read_next(c, io))!=0)
			{
				switch(chunk)
				{
					case Lib3dsChunks.CHK_DL_SPOT_ROLL: light.roll=lib3ds_io_read_float(io); break;
					case Lib3dsChunks.CHK_DL_SHADOWED: light.shadowed=true; break;
					case Lib3dsChunks.CHK_DL_LOCAL_SHADOW2:
						light.shadow_bias=lib3ds_io_read_float(io);
						light.shadow_filter=lib3ds_io_read_float(io);
						light.shadow_size=lib3ds_io_read_intw(io);
						break;
					case Lib3dsChunks.CHK_DL_SEE_CONE: light.see_cone=true; break;
					case Lib3dsChunks.CHK_DL_SPOT_RECTANGULAR: light.rectangular_spot=true; break;
					case Lib3dsChunks.CHK_DL_SPOT_ASPECT: light.spot_aspect=lib3ds_io_read_float(io); break;
					case Lib3dsChunks.CHK_DL_SPOT_PROJECTOR:
						light.use_projector=true;
						light.projector=lib3ds_io_read_string(io, 64);
						break;
					case Lib3dsChunks.CHK_DL_SPOT_OVERSHOOT: light.spot_overshoot=true; break;
					case Lib3dsChunks.CHK_DL_RAY_BIAS: light.ray_bias=lib3ds_io_read_float(io); break;
					case Lib3dsChunks.CHK_DL_RAYSHAD: light.ray_shadows=true; break;
					default: lib3ds_chunk_unknown(chunk, io); break;
				}
			}

			lib3ds_chunk_read_end(c, io);
		}
Ejemplo n.º 42
0
		public static void lib3ds_track_read(Lib3dsTrack track, Lib3dsIo io)
		{
			track.flags=(Lib3dsTrackFlags)lib3ds_io_read_word(io);
			lib3ds_io_read_dword(io);
			lib3ds_io_read_dword(io);
			int nkeys=lib3ds_io_read_intd(io);
			lib3ds_track_resize(track, nkeys);

			switch(track.type)
			{
				case Lib3dsTrackType.LIB3DS_TRACK_BOOL:
					for(int i=0; i<nkeys; i++)
					{
						track.keys[i].frame=lib3ds_io_read_intd(io);
						tcb_read(track.keys[i], io);
					}
					break;
				case Lib3dsTrackType.LIB3DS_TRACK_FLOAT:
					for(int i=0; i<nkeys; i++)
					{
						track.keys[i].frame=lib3ds_io_read_intd(io);
						tcb_read(track.keys[i], io);
						track.keys[i].value[0]=lib3ds_io_read_float(io);
					}
					break;
				case Lib3dsTrackType.LIB3DS_TRACK_VECTOR:
					for(int i=0; i<nkeys; i++)
					{
						track.keys[i].frame=lib3ds_io_read_intd(io);
						tcb_read(track.keys[i], io);
						lib3ds_io_read_vector(io, track.keys[i].value);
					}
					break;
				case Lib3dsTrackType.LIB3DS_TRACK_QUAT:
					for(int i=0; i<nkeys; i++)
					{
						track.keys[i].frame=lib3ds_io_read_intd(io);
						tcb_read(track.keys[i], io);
						track.keys[i].value[3]=lib3ds_io_read_float(io);
						lib3ds_io_read_vector(io, track.keys[i].value);
					}
					break;
				//case Lib3dsTrackType.LIB3DS_TRACK_MORPH:
				//    for(int i=0; i<nkeys; i++)
				//    {
				//        track.keys[i].frame = lib3ds_io_read_intd(io);
				//        tcb_read(track.keys[i].tcb, io);
				//        lib3ds_io_read_string(io, track.keys[i].data.m.name, 64);
				//    }
				//    break;
			}
		}
Ejemplo n.º 43
0
		static void tcb_read(Lib3dsKey key, Lib3dsIo io)
		{
			key.flags=(Lib3dsKeyFlags)lib3ds_io_read_word(io);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_TENS)!=0) key.tens=lib3ds_io_read_float(io);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_CONT)!=0) key.cont=lib3ds_io_read_float(io);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_BIAS)!=0) key.bias=lib3ds_io_read_float(io);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_EASE_TO)!=0) key.ease_to=lib3ds_io_read_float(io);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_EASE_FROM)!=0) key.ease_from=lib3ds_io_read_float(io);
		}
Ejemplo n.º 44
0
		static void named_object_read(Lib3dsFile file, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();
			string name;
			Lib3dsChunks chunk;

			Lib3dsMesh mesh=null;
			Lib3dsCamera camera=null;
			Lib3dsLight light=null;
			Lib3dsObjectFlags object_flags=0;

			lib3ds_chunk_read_start(c, Lib3dsChunks.CHK_NAMED_OBJECT, io);

			name=lib3ds_io_read_string(io, 64);
			lib3ds_io_log(io, Lib3dsLogLevel.LIB3DS_LOG_INFO, "NAME={0}", name);
			lib3ds_chunk_read_tell(c, io);

			while((chunk=lib3ds_chunk_read_next(c, io))!=0)
			{
				switch(chunk)
				{
					case Lib3dsChunks.CHK_N_TRI_OBJECT:
						mesh=lib3ds_mesh_new(name);
						lib3ds_file_insert_mesh(file, mesh, -1);
						lib3ds_chunk_read_reset(c, io);
						lib3ds_mesh_read(file, mesh, io);
						break;
					case Lib3dsChunks.CHK_N_CAMERA:
						camera=lib3ds_camera_new(name);
						lib3ds_file_insert_camera(file, camera, -1);
						lib3ds_chunk_read_reset(c, io);
						lib3ds_camera_read(camera, io);
						break;
					case Lib3dsChunks.CHK_N_DIRECT_LIGHT:
						light=lib3ds_light_new(name);
						lib3ds_file_insert_light(file, light, -1);
						lib3ds_chunk_read_reset(c, io);
						lib3ds_light_read(light, io);
						break;
					case Lib3dsChunks.CHK_OBJ_HIDDEN: object_flags|=Lib3dsObjectFlags.LIB3DS_OBJECT_HIDDEN; break;
					case Lib3dsChunks.CHK_OBJ_DOESNT_CAST: object_flags|=Lib3dsObjectFlags.LIB3DS_OBJECT_DOESNT_CAST; break;
					case Lib3dsChunks.CHK_OBJ_VIS_LOFTER: object_flags|=Lib3dsObjectFlags.LIB3DS_OBJECT_VIS_LOFTER; break;
					case Lib3dsChunks.CHK_OBJ_MATTE: object_flags|=Lib3dsObjectFlags.LIB3DS_OBJECT_MATTE; break;
					case Lib3dsChunks.CHK_OBJ_DONT_RCVSHADOW: object_flags|=Lib3dsObjectFlags.LIB3DS_OBJECT_DONT_RCVSHADOW; break;
					case Lib3dsChunks.CHK_OBJ_FAST: object_flags|=Lib3dsObjectFlags.LIB3DS_OBJECT_FAST; break;
					case Lib3dsChunks.CHK_OBJ_FROZEN: object_flags|=Lib3dsObjectFlags.LIB3DS_OBJECT_FROZEN; break;
					default: lib3ds_chunk_unknown(chunk, io); break;
				}
			}

			if(mesh!=null) mesh.object_flags=object_flags;
			if(camera!=null) camera.object_flags=object_flags;
			if(light!=null) light.object_flags=object_flags;

			lib3ds_chunk_read_end(c, io);
		}
Ejemplo n.º 45
0
		static void ambient_read(Lib3dsFile file, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();
			Lib3dsChunks chunk;
			bool have_lin=false;

			lib3ds_chunk_read_start(c, Lib3dsChunks.CHK_AMBIENT_LIGHT, io);

			while((chunk=lib3ds_chunk_read_next(c, io))!=0)
			{
				switch(chunk)
				{
					case Lib3dsChunks.CHK_LIN_COLOR_F:
						for(int i=0; i<3; i++) file.ambient[i]=lib3ds_io_read_float(io);
						have_lin=true;
						break;
					case Lib3dsChunks.CHK_COLOR_F:
						// gamma corrected color chunk
						// replaced in 3ds R3 by LIN_COLOR_24
						if(!have_lin)
						{
							for(int i=0; i<3; i++) file.ambient[i]=lib3ds_io_read_float(io);
						}
						break;
					default: lib3ds_chunk_unknown(chunk, io); break;
				}
			}

			lib3ds_chunk_read_end(c, io);
		}
Ejemplo n.º 46
0
		static void mdata_read(Lib3dsFile file, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();
			Lib3dsChunks chunk;

			lib3ds_chunk_read_start(c, Lib3dsChunks.CHK_MDATA, io);

			while((chunk=lib3ds_chunk_read_next(c, io))!=0)
			{
				switch(chunk)
				{
					case Lib3dsChunks.CHK_MESH_VERSION: file.mesh_version=lib3ds_io_read_dword(io); break;
					case Lib3dsChunks.CHK_MASTER_SCALE: file.master_scale=lib3ds_io_read_float(io); break;
					case Lib3dsChunks.CHK_SHADOW_MAP_SIZE:
					case Lib3dsChunks.CHK_LO_SHADOW_BIAS:
					case Lib3dsChunks.CHK_HI_SHADOW_BIAS:
					case Lib3dsChunks.CHK_SHADOW_SAMPLES:
					case Lib3dsChunks.CHK_SHADOW_RANGE:
					case Lib3dsChunks.CHK_SHADOW_FILTER:
					case Lib3dsChunks.CHK_RAY_BIAS:
						lib3ds_chunk_read_reset(c, io);
						lib3ds_shadow_read(file.shadow, io);
						break;
					case Lib3dsChunks.CHK_VIEWPORT_LAYOUT:
					case Lib3dsChunks.CHK_DEFAULT_VIEW:
						lib3ds_chunk_read_reset(c, io);
						lib3ds_viewport_read(file.viewport, io);
						break;
					case Lib3dsChunks.CHK_O_CONSTS:
						for(int i=0; i<3; i++) file.construction_plane[i]=lib3ds_io_read_float(io);
						break;
					case Lib3dsChunks.CHK_AMBIENT_LIGHT:
						lib3ds_chunk_read_reset(c, io);
						ambient_read(file, io);
						break;
					case Lib3dsChunks.CHK_BIT_MAP:
					case Lib3dsChunks.CHK_SOLID_BGND:
					case Lib3dsChunks.CHK_V_GRADIENT:
					case Lib3dsChunks.CHK_USE_BIT_MAP:
					case Lib3dsChunks.CHK_USE_SOLID_BGND:
					case Lib3dsChunks.CHK_USE_V_GRADIENT:
						lib3ds_chunk_read_reset(c, io);
						lib3ds_background_read(file.background, io);
						break;
					case Lib3dsChunks.CHK_FOG:
					case Lib3dsChunks.CHK_LAYER_FOG:
					case Lib3dsChunks.CHK_DISTANCE_CUE:
					case Lib3dsChunks.CHK_USE_FOG:
					case Lib3dsChunks.CHK_USE_LAYER_FOG:
					case Lib3dsChunks.CHK_USE_DISTANCE_CUE:
						lib3ds_chunk_read_reset(c, io);
						lib3ds_atmosphere_read(file.atmosphere, io);
						break;
					case Lib3dsChunks.CHK_MAT_ENTRY:
						Lib3dsMaterial material=lib3ds_material_new(null);
						lib3ds_file_insert_material(file, material, -1);
						lib3ds_chunk_read_reset(c, io);
						lib3ds_material_read(material, io);
						break;
					case Lib3dsChunks.CHK_NAMED_OBJECT:
						lib3ds_chunk_read_reset(c, io);
						named_object_read(file, io);
						break;
					default: lib3ds_chunk_unknown(chunk, io); break;
				}
			}

			lib3ds_chunk_read_end(c, io);
		}
Ejemplo n.º 47
0
		// Read 3ds file data into a Lib3dsFile object.
		//
		// \param file The Lib3dsFile object to be filled.
		// \param io A Lib3dsIo object previously set up by the caller.
		//
		// \return true on success, false on failure.
		public static bool lib3ds_file_read(Lib3dsFile file, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();
			Lib3dsChunks chunk;

			lib3ds_io_setup(io);

			try
			{
				lib3ds_chunk_read_start(c, 0, io);

				switch(c.chunk)
				{
					case Lib3dsChunks.CHK_MDATA:
						lib3ds_chunk_read_reset(c, io);
						mdata_read(file, io);
						break;
					case Lib3dsChunks.CHK_M3DMAGIC:
					case Lib3dsChunks.CHK_MLIBMAGIC:
					case Lib3dsChunks.CHK_CMAGIC:
						while((chunk=lib3ds_chunk_read_next(c, io))!=0)
						{
							switch(chunk)
							{
								case Lib3dsChunks.CHK_M3D_VERSION:
									file.mesh_version=lib3ds_io_read_dword(io);
									break;
								case Lib3dsChunks.CHK_MDATA:
									lib3ds_chunk_read_reset(c, io);
									mdata_read(file, io);
									break;
								case Lib3dsChunks.CHK_KFDATA:
									lib3ds_chunk_read_reset(c, io);
									kfdata_read(file, io);
									break;
								default: lib3ds_chunk_unknown(chunk, io); break;
							}
						}
						break;
					default:
						lib3ds_chunk_unknown(c.chunk, io);
						return false;
				}

				lib3ds_chunk_read_end(c, io);
				lib3ds_io_cleanup(io);
				return true;
			}
			catch
			{
				lib3ds_io_cleanup(io);
				return false;
			}
		}
Ejemplo n.º 48
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);
		}
Ejemplo n.º 49
0
		public static Lib3dsFile lib3ds_file_open(Stream stream, log_func log_func)
		{
			try
			{
				Lib3dsIo io=new Lib3dsIo();
				io.self=stream;
				io.seek_func=fileio_seek_func;
				io.tell_func=fileio_tell_func;
				io.read_func=fileio_read_func;
				io.write_func=fileio_write_func;
				io.log_func=log_func;

				Lib3dsFile file=lib3ds_file_new();
				if(file==null) return null;

				if(!lib3ds_file_read(file, io)) return null;

				return file;
			}
			catch
			{
				return null;
			}
		}
Ejemplo n.º 50
0
		// Write 3ds file data from a Lib3dsFile object to a file.
		//
		// \param file The Lib3dsFile object to be written.
		// \param io A Lib3dsIo object previously set up by the caller.
		//
		// \return true on success, false on failure.
		public static bool lib3ds_file_write(Lib3dsFile file, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();

			lib3ds_io_setup(io);

			try
			{
				c.chunk=Lib3dsChunks.CHK_M3DMAGIC;
				lib3ds_chunk_write_start(c, io);

				// ---- LIB3DS_M3D_VERSION ----
				Lib3dsChunk c_version=new Lib3dsChunk();
				c_version.chunk=Lib3dsChunks.CHK_M3D_VERSION;
				c_version.size=10;
				lib3ds_chunk_write(c_version, io);
				lib3ds_io_write_dword(io, file.mesh_version);

				mdata_write(file, io);
				kfdata_write(file, io);

				lib3ds_chunk_write_end(c, io);

				lib3ds_io_cleanup(io);
				return true;
			}
			catch
			{
				lib3ds_io_cleanup(io);
				return false;
			}
		}
Ejemplo n.º 51
0
		static void kfdata_write(Lib3dsFile file, Lib3dsIo io)
		{
			if(file.nodes.Count==0) return;

			Lib3dsChunk c_kfdata=new Lib3dsChunk();
			c_kfdata.chunk=Lib3dsChunks.CHK_KFDATA;
			lib3ds_chunk_write_start(c_kfdata, io);

			{ // ---- LIB3DS_KFHDR ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_KFHDR;
				c.size=6+2+(uint)file.name.Length+1+4;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_intw(io, (short)file.keyf_revision);
				lib3ds_io_write_string(io, file.name);
				lib3ds_io_write_intd(io, file.frames);
			}
			{ // ---- LIB3DS_KFSEG ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_KFSEG;
				c.size=14;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_intd(io, file.segment_from);
				lib3ds_io_write_intd(io, file.segment_to);
			}
			{ // ---- LIB3DS_KFCURTIME ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_KFCURTIME;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_intd(io, file.current_frame);
			}
			lib3ds_viewport_write(file.viewport_keyf, io);

			ushort default_id=0;
			nodes_write(file.nodes, ref default_id, 65535, io);

			lib3ds_chunk_write_end(c_kfdata, io);
		}
Ejemplo n.º 52
0
		static void nodes_write(List<Lib3dsNode> nodes, ref ushort default_id, ushort parent_id, Lib3dsIo io)
		{
			foreach(Lib3dsNode p in nodes)
			{
				ushort node_id;
				if((p.type==Lib3dsNodeType.LIB3DS_NODE_AMBIENT_COLOR)||(p.node_id!=65535)) node_id=p.node_id;
				else node_id=default_id;
				default_id++;
				lib3ds_node_write(p, node_id, parent_id, io);

				nodes_write(p.childs, ref default_id, node_id, io);
			}
		}
Ejemplo n.º 53
0
		static void mdata_write(Lib3dsFile file, Lib3dsIo io)
		{
			Lib3dsChunk c_mdata=new Lib3dsChunk();

			c_mdata.chunk=Lib3dsChunks.CHK_MDATA;
			lib3ds_chunk_write_start(c_mdata, io);

			{ // ---- LIB3DS_MESH_VERSION ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_MESH_VERSION;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_intd(io, (int)file.mesh_version);
			}
			{ // ---- LIB3DS_MASTER_SCALE ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_MASTER_SCALE;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_float(io, file.master_scale);
			}
			{ // ---- LIB3DS_O_CONSTS ----
				int i;
				for(i=0; i<3; i++) if(Math.Abs(file.construction_plane[i])>EPSILON) break;
				if(i<3)
				{
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_O_CONSTS;
					c.size=18;
					lib3ds_chunk_write(c, io);
					lib3ds_io_write_vector(io, file.construction_plane);
				}
			}
			{ // ---- LIB3DS_AMBIENT_LIGHT ----
				int i;
				for(i=0; i<3; i++) if(Math.Abs(file.ambient[i])>EPSILON) break;
				if(i<3)
				{
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_AMBIENT_LIGHT;
					c.size=42;
					lib3ds_chunk_write(c, io);
					colorf_write(file.ambient, io);
				}
			}
			lib3ds_background_write(file.background, io);
			lib3ds_atmosphere_write(file.atmosphere, io);
			lib3ds_shadow_write(file.shadow, io);
			lib3ds_viewport_write(file.viewport, io);
			{
				foreach(Lib3dsMaterial material in file.materials) lib3ds_material_write(material, io);
			}
			{
				Lib3dsChunk c=new Lib3dsChunk();
				foreach(Lib3dsCamera camera in file.cameras)
				{
					c.chunk=Lib3dsChunks.CHK_NAMED_OBJECT;
					lib3ds_chunk_write_start(c, io);
					lib3ds_io_write_string(io, camera.name);
					lib3ds_camera_write(camera, io);
					object_flags_write(camera.object_flags, io);
					lib3ds_chunk_write_end(c, io);
				}
			}
			{
				Lib3dsChunk c=new Lib3dsChunk();
				foreach(Lib3dsLight light in file.lights)
				{
					c.chunk=Lib3dsChunks.CHK_NAMED_OBJECT;
					lib3ds_chunk_write_start(c, io);
					lib3ds_io_write_string(io, light.name);
					lib3ds_light_write(light, io);
					object_flags_write(light.object_flags, io);
					lib3ds_chunk_write_end(c, io);
				}
			}
			{
				Lib3dsChunk c=new Lib3dsChunk();
				foreach(Lib3dsMesh mesh in file.meshes)
				{
					c.chunk=Lib3dsChunks.CHK_NAMED_OBJECT;
					lib3ds_chunk_write_start(c, io);
					lib3ds_io_write_string(io, mesh.name);
					lib3ds_mesh_write(file, mesh, io);
					object_flags_write(mesh.object_flags, io);
					lib3ds_chunk_write_end(c, io);
				}
			}

			lib3ds_chunk_write_end(c_mdata, io);
		}
Ejemplo n.º 54
0
		static void object_flags_write(Lib3dsObjectFlags flags, Lib3dsIo io)
		{
			if(flags==0) return;

			Lib3dsChunk c=new Lib3dsChunk();
			c.size=6;

			if((flags&Lib3dsObjectFlags.LIB3DS_OBJECT_HIDDEN)!=0)
			{
				c.chunk=Lib3dsChunks.CHK_OBJ_HIDDEN;
				lib3ds_chunk_write(c, io);
			}
			if((flags&Lib3dsObjectFlags.LIB3DS_OBJECT_VIS_LOFTER)!=0)
			{
				c.chunk=Lib3dsChunks.CHK_OBJ_VIS_LOFTER;
				lib3ds_chunk_write(c, io);
			}
			if((flags&Lib3dsObjectFlags.LIB3DS_OBJECT_DOESNT_CAST)!=0)
			{
				c.chunk=Lib3dsChunks.CHK_OBJ_DOESNT_CAST;
				lib3ds_chunk_write(c, io);
			}
			if((flags&Lib3dsObjectFlags.LIB3DS_OBJECT_MATTE)!=0)
			{
				c.chunk=Lib3dsChunks.CHK_OBJ_MATTE;
				lib3ds_chunk_write(c, io);
			}
			if((flags&Lib3dsObjectFlags.LIB3DS_OBJECT_DONT_RCVSHADOW)!=0)
			{
				c.chunk=Lib3dsChunks.CHK_OBJ_DOESNT_CAST;
				lib3ds_chunk_write(c, io);
			}
			if((flags&Lib3dsObjectFlags.LIB3DS_OBJECT_FAST)!=0)
			{
				c.chunk=Lib3dsChunks.CHK_OBJ_FAST;
				lib3ds_chunk_write(c, io);
			}
			if((flags&Lib3dsObjectFlags.LIB3DS_OBJECT_FROZEN)!=0)
			{
				c.chunk=Lib3dsChunks.CHK_OBJ_FROZEN;
				lib3ds_chunk_write(c, io);
			}
		}
Ejemplo n.º 55
0
		static void colorf_write(float[] rgb, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();

			c.chunk=Lib3dsChunks.CHK_COLOR_F;
			c.size=18;
			lib3ds_chunk_write(c, io);
			lib3ds_io_write_rgb(io, rgb);

			c.chunk=Lib3dsChunks.CHK_LIN_COLOR_F;
			c.size=18;
			lib3ds_chunk_write(c, io);
			lib3ds_io_write_rgb(io, rgb);
		}
Ejemplo n.º 56
0
		public static void tcb_write(Lib3dsKey key, Lib3dsIo io)
		{
			lib3ds_io_write_word(io, (ushort)key.flags);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_TENS)!=0) lib3ds_io_write_float(io, key.tens);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_CONT)!=0) lib3ds_io_write_float(io, key.cont);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_BIAS)!=0) lib3ds_io_write_float(io, key.bias);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_EASE_TO)!=0) lib3ds_io_write_float(io, key.ease_to);
			if((key.flags&Lib3dsKeyFlags.LIB3DS_KEY_USE_EASE_FROM)!=0) lib3ds_io_write_float(io, key.ease_from);
		}
Ejemplo n.º 57
0
		public static void lib3ds_track_write(Lib3dsTrack track, Lib3dsIo io)
		{
			lib3ds_io_write_word(io, (ushort)track.flags);
			lib3ds_io_write_dword(io, 0);
			lib3ds_io_write_dword(io, 0);
			lib3ds_io_write_intd(io, track.keys.Count);

			switch(track.type)
			{
				case Lib3dsTrackType.LIB3DS_TRACK_BOOL:
					for(int i=0; i<track.keys.Count; i++)
					{
						lib3ds_io_write_intd(io, track.keys[i].frame);
						tcb_write(track.keys[i], io);
					}
					break;
				case Lib3dsTrackType.LIB3DS_TRACK_FLOAT:
					for(int i=0; i<track.keys.Count; i++)
					{
						lib3ds_io_write_intd(io, track.keys[i].frame);
						tcb_write(track.keys[i], io);
						lib3ds_io_write_float(io, track.keys[i].value[0]);
					}
					break;
				case Lib3dsTrackType.LIB3DS_TRACK_VECTOR:
					for(int i=0; i<track.keys.Count; i++)
					{
						lib3ds_io_write_intd(io, track.keys[i].frame);
						tcb_write(track.keys[i], io);
						lib3ds_io_write_vector(io, track.keys[i].value);
					}
					break;
				case Lib3dsTrackType.LIB3DS_TRACK_QUAT:
					for(int i=0; i<track.keys.Count; i++)
					{
						lib3ds_io_write_intd(io, track.keys[i].frame);
						tcb_write(track.keys[i], io);
						lib3ds_io_write_float(io, track.keys[i].value[3]);
						lib3ds_io_write_vector(io, track.keys[i].value);
					}
					break;
				//case Lib3dsTrackType.LIB3DS_TRACK_MORPH:
				//    for(int i=0; i<track.keys.Count; i++)
				//    {
				//        lib3ds_io_write_intd(io, track.keys[i].frame);
				//        tcb_write(track.keys[i].tcb, io);
				//        lib3ds_io_write_string(io, track.keys[i].data.m.name);
				//    }
				//    break;
			}
		}
Ejemplo n.º 58
0
		public static void lib3ds_light_write(Lib3dsLight light, Lib3dsIo io)
		{
			Lib3dsChunk c_n_direct_light=new Lib3dsChunk();

			c_n_direct_light.chunk=Lib3dsChunks.CHK_N_DIRECT_LIGHT;
			lib3ds_chunk_write_start(c_n_direct_light, io);

			lib3ds_io_write_vector(io, light.position);
			{ // ---- LIB3DS_COLOR_F ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_COLOR_F;
				c.size=18;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_rgb(io, light.color);
			}
			if(light.off)
			{ // ---- LIB3DS_DL_OFF ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_DL_OFF;
				c.size=6;
				lib3ds_chunk_write(c, io);
			}
			{ // ---- LIB3DS_DL_OUTER_RANGE ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_DL_OUTER_RANGE;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_float(io, light.outer_range);
			}
			{ // ---- LIB3DS_DL_INNER_RANGE ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_DL_INNER_RANGE;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_float(io, light.inner_range);
			}
			{ // ---- LIB3DS_DL_MULTIPLIER ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_DL_MULTIPLIER;
				c.size=10;
				lib3ds_chunk_write(c, io);
				lib3ds_io_write_float(io, light.multiplier);
			}
			if(light.attenuation!=0)
			{ // ---- LIB3DS_DL_ATTENUATE ----
				Lib3dsChunk c=new Lib3dsChunk();
				c.chunk=Lib3dsChunks.CHK_DL_ATTENUATE;
				c.size=6;
				lib3ds_chunk_write(c, io);
			}

			if(light.spot_light)
			{
				Lib3dsChunk c_dl_spotlight=new Lib3dsChunk();

				c_dl_spotlight.chunk=Lib3dsChunks.CHK_DL_SPOTLIGHT;
				lib3ds_chunk_write_start(c_dl_spotlight, io);

				lib3ds_io_write_vector(io, light.target);
				lib3ds_io_write_float(io, light.hotspot);
				lib3ds_io_write_float(io, light.falloff);

				{ // ---- LIB3DS_DL_SPOT_ROLL ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_SPOT_ROLL;
					c.size=10;
					lib3ds_chunk_write(c, io);
					lib3ds_io_write_float(io, light.roll);
				}
				if(light.shadowed)
				{ // ---- LIB3DS_DL_SHADOWED ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_SHADOWED;
					c.size=6;
					lib3ds_chunk_write(c, io);
				}
				if((Math.Abs(light.shadow_bias)>EPSILON)||(Math.Abs(light.shadow_filter)>EPSILON)||(light.shadow_size!=0))
				{ // ---- LIB3DS_DL_LOCAL_SHADOW2 ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_LOCAL_SHADOW2;
					c.size=16;
					lib3ds_chunk_write(c, io);
					lib3ds_io_write_float(io, light.shadow_bias);
					lib3ds_io_write_float(io, light.shadow_filter);
					lib3ds_io_write_intw(io, (short)light.shadow_size);
				}
				if(light.see_cone)
				{ // ---- LIB3DS_DL_SEE_CONE ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_SEE_CONE;
					c.size=6;
					lib3ds_chunk_write(c, io);
				}
				if(light.rectangular_spot)
				{ // ---- LIB3DS_DL_SPOT_RECTANGULAR ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_SPOT_RECTANGULAR;
					c.size=6;
					lib3ds_chunk_write(c, io);
				}
				if(Math.Abs(light.spot_aspect)>EPSILON)
				{ // ---- LIB3DS_DL_SPOT_ASPECT ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_SPOT_ASPECT;
					c.size=10;
					lib3ds_chunk_write(c, io);
					lib3ds_io_write_float(io, light.spot_aspect);
				}
				if(light.use_projector)
				{ // ---- LIB3DS_DL_SPOT_PROJECTOR ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_SPOT_PROJECTOR;
					c.size=10;
					lib3ds_chunk_write(c, io);
					lib3ds_io_write_string(io, light.projector);
				}
				if(light.spot_overshoot)
				{ // ---- LIB3DS_DL_SPOT_OVERSHOOT ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_SPOT_OVERSHOOT;
					c.size=6;
					lib3ds_chunk_write(c, io);
				}
				if(Math.Abs(light.ray_bias)>EPSILON)
				{ // ---- LIB3DS_DL_RAY_BIAS ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_RAY_BIAS;
					c.size=10;
					lib3ds_chunk_write(c, io);
					lib3ds_io_write_float(io, light.ray_bias);
				}
				if(light.ray_shadows)
				{ // ---- LIB3DS_DL_RAYSHAD ----
					Lib3dsChunk c=new Lib3dsChunk();
					c.chunk=Lib3dsChunks.CHK_DL_RAYSHAD;
					c.size=6;
					lib3ds_chunk_write(c, io);
				}
				lib3ds_chunk_write_end(c_dl_spotlight, io);
			}

			lib3ds_chunk_write_end(c_n_direct_light, io);
		}
Ejemplo n.º 59
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);
		}
Ejemplo n.º 60
0
		static void kfdata_read(Lib3dsFile file, Lib3dsIo io)
		{
			Lib3dsChunk c=new Lib3dsChunk();
			Lib3dsChunks chunk;

			lib3ds_chunk_read_start(c, Lib3dsChunks.CHK_KFDATA, io);

			while((chunk=lib3ds_chunk_read_next(c, io))!=0)
			{
				switch(chunk)
				{
					case Lib3dsChunks.CHK_KFHDR:
						file.keyf_revision=lib3ds_io_read_word(io);
						file.name=lib3ds_io_read_string(io, 12+1);
						file.frames=lib3ds_io_read_intd(io);
						break;
					case Lib3dsChunks.CHK_KFSEG:
						file.segment_from=lib3ds_io_read_intd(io);
						file.segment_to=lib3ds_io_read_intd(io);
						break;
					case Lib3dsChunks.CHK_KFCURTIME:
						file.current_frame=lib3ds_io_read_intd(io);
						break;
					case Lib3dsChunks.CHK_VIEWPORT_LAYOUT:
					case Lib3dsChunks.CHK_DEFAULT_VIEW:
						lib3ds_chunk_read_reset(c, io);
						lib3ds_viewport_read(file.viewport_keyf, io);
						break;
					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:
						Lib3dsNodeType type;
						switch(chunk)
						{
							case Lib3dsChunks.CHK_AMBIENT_NODE_TAG: type=Lib3dsNodeType.LIB3DS_NODE_AMBIENT_COLOR; break;
							case Lib3dsChunks.CHK_OBJECT_NODE_TAG: type=Lib3dsNodeType.LIB3DS_NODE_MESH_INSTANCE; break;
							case Lib3dsChunks.CHK_CAMERA_NODE_TAG: type=Lib3dsNodeType.LIB3DS_NODE_CAMERA; break;
							case Lib3dsChunks.CHK_TARGET_NODE_TAG: type=Lib3dsNodeType.LIB3DS_NODE_CAMERA_TARGET; break;
							case Lib3dsChunks.CHK_LIGHT_NODE_TAG: type=Lib3dsNodeType.LIB3DS_NODE_OMNILIGHT; break;
							case Lib3dsChunks.CHK_SPOTLIGHT_NODE_TAG: type=Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT; break;
							case Lib3dsChunks.CHK_L_TARGET_NODE_TAG: type=Lib3dsNodeType.LIB3DS_NODE_SPOTLIGHT_TARGET; break;
							default: throw new Exception("Unknown chunk type.");
						}

						Lib3dsNode node=lib3ds_node_new(type);
						file.nodes.Add(node);
						lib3ds_chunk_read_reset(c, io);
						lib3ds_node_read(node, io);
						break;
					default: lib3ds_chunk_unknown(chunk, io); break;
				}
			}

			// fehlende Node IDs vergeben
			List<Lib3dsNode> missingIDs=new List<Lib3dsNode>();
			Dictionary<ushort, Lib3dsNode> hasIDs=new Dictionary<ushort, Lib3dsNode>();

			foreach(Lib3dsNode node in file.nodes)
			{
				if(!node.hasNodeID) missingIDs.Add(node);
				else if(!hasIDs.ContainsKey(node.node_id)) hasIDs.Add(node.node_id, node);
			}

			ushort num_nodes=0;
			foreach(Lib3dsNode node in missingIDs)
			{
				while(hasIDs.ContainsKey(num_nodes))
				{
					num_nodes++;
					if(num_nodes==65535) throw new Exception("Out of IDs.");
				}

				node.node_id=num_nodes;
				node.hasNodeID=true;
				hasIDs.Add(num_nodes, node);

				num_nodes++;
				if(num_nodes==65535) throw new Exception("Out of IDs.");
			}

			missingIDs.Clear();

			foreach(Lib3dsNode node in file.nodes)
			{
				if(node.parent_id!=65535&&hasIDs.ContainsKey(node.parent_id))
				{
					Lib3dsNode parent=hasIDs[node.parent_id];
					parent.childs.Add(node);
					node.parent=parent;
				}
			}

			lib3ds_chunk_read_end(c, io);
		}