예제 #1
0
        private void saveJF3D(OpenGLModel model, IOStream os)
        {
            baos = new ByteArrayStream();
            tmp  = new byte[8];
            int size;

            writeuint32(MAGIC);
            writeuint32(VERSION);
            writeuint32(ID_MODEL);
            size = 0;
            int tcnt = model.textures.Size();

            for (int a = 0; a < tcnt; a++)
            {
                size += model.textures.Get(a).Length + 1;
            }
            writeuint32(size);
            writeuint32(tcnt);
            for (int a = 0; a < tcnt; a++)
            {
                writeString(model.textures.Get(a));
            }
            for (int o = 0; o < model.ol.Size(); o++)
            {
                OpenGLObject obj = model.ol.Get(o);
                writeuint32(ID_OBJECT);
                int vcnt = obj.GetVertexCount() * 3;
                int pcnt = obj.GetPolyCount();
                size = obj.GetName().Length + 1 + 4 + (4 * 3) + (4 + (vcnt * 4)) + (4 + (pcnt * 4));
                writeuint32(size);
                writeString(obj.GetName());
                writeuint32(obj.GetType());
                writefloat(obj.GetOrigin().x);
                writefloat(obj.GetOrigin().y);
                writefloat(obj.GetOrigin().z);
                writeuint32(vcnt / 3);
                float[] xyz = obj.GetVertexBuffer();
                for (int a = 0; a < vcnt; a++)
                {
                    writefloat(xyz[a]);
                }
                switch (obj.GetType())
                {
                case GL_TRIANGLES:
                    writeuint32(pcnt / 3);
                    break;

                case GL_QUADS:
                    writeuint32(pcnt / 4);
                    break;
                }
                int[] pts = obj.GetPolyBuffer();
                for (int a = 0; a < pcnt; a++)
                {
                    writeuint32(pts[a]);
                }
                int maps = obj.GetUVMaps().Size();
                if (maps == 0)
                {
                    Console.WriteLine("GL_JF3D:Warning:No UVMaps found for object:" + obj.GetName());
                }
                for (int m = 0; m < maps; m++)
                {
                    OpenGLUVMap map = obj.GetUVMaps().Get(m);
                    writeuint32(ID_UVMAP);
                    int uvcnt = map.GetUVCount() * 2;
                    size = map.GetName().Length + 1 + 4 + (4 + (uvcnt * 4));
                    writeuint32(size);
                    writeString(map.GetName());
                    writeuint32(map.GetTextureIndex());
                    writeuint32(uvcnt / 2);
                    float[] uv = map.GetBuffer();
                    for (int a = 0; a < uvcnt; a++)
                    {
                        writefloat(uv[a]);
                    }
                }
            }
            os.Write(baos.GetData().ToArray());
        }
예제 #2
0
        public bool Save(string filename, PlayerData playerData)
        {
            ByteArrayStream stream = new ByteArrayStream();

            stream.WriteString("PTFF", 4);

            byte version = playerData.Version;

            stream.WriteByte(version);

            stream.WriteByte(0); // ??

            stream.WriteUShort(playerData.TickPerMinute);
            stream.WriteFloat(playerData.Tempo);

            UInt16 trackCount = playerData.Tracks.Count;

            stream.WriteUShort(trackCount);
            stream.writeUInt(playerData.HeaderEndTick);
            stream.WriteFloat(playerData.TrackDuration);

            ushort insCount = (ushort)(playerData.Instruments.Count - 1);

            stream.WriteUShort(insCount);

            for (int i = 0, l = playerData.Instruments.Count; i < l; i++)
            {
                InstrumentData ins = playerData.Instruments[i];
                if (ins != null && ins.InsNum != 0)
                {
                    if (version == 1)
                    {
                        stream.WriteUShort(ins.InsNum);
                        stream.WriteUShort(0);
                    }
                    else
                    {
                        stream.WriteByte((byte)ins.InsNum);
                        stream.WriteByte(0);
                    }

                    stream.WriteString(ins.Name, 0x40);
                }
            }

            int eventSize = version == 1 ? 0x10 : 0x0B;

            foreach (TrackData track in playerData.Tracks)
            {
                stream.writeUInt(EZTR);

                int eventsCount = track.Events.Count();
                int endTick     = 0;
                if (eventsCount > 0)
                {
                    endTick = track.Events.Max(evnt => evnt.Tick);
                }

                uint blockSize = (uint)(eventsCount * eventSize);

                stream.WriteString("", 0x02); // unknown

                stream.WriteString(track.TrackName, 0x40);

                stream.writeInt(endTick);
                stream.writeUInt(blockSize);

                if (version == 1)
                {
                    stream.WriteUShort(0); // Unknown
                }

                foreach (EventData evnt in track.Events)
                {
                    stream.writeInt(evnt.Tick);
                    stream.WriteByte((byte)evnt.EventType);

                    switch (evnt.EventType)
                    {
                    case EventType.Volume:
                    {
                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        stream.WriteByte(evnt.Volume);
                        stream.WriteByte(0);

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }
                    }
                    break;

                    case EventType.Note:
                    {
                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        ushort insno = 0;

                        if (evnt.Instrument != null)
                        {
                            insno = evnt.Instrument.InsNum;
                        }

                        if (version == 1)
                        {
                            stream.WriteUShort(insno);
                        }
                        else
                        {
                            stream.WriteByte((byte)insno);
                        }

                        stream.WriteByte(evnt.Vel);
                        stream.WriteByte(evnt.Pan);

                        stream.WriteByte(evnt.Attribute);
                        stream.WriteUShort(evnt.Duration);

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                        }
                    }
                    break;

                    case EventType.Tempo:

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        stream.Write(BitConverter.GetBytes(evnt.Tempo));

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        break;

                    case EventType.Beat:

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        stream.WriteUShort(evnt.Beat);

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        stream.WriteByte(0);
                        stream.WriteByte(0);

                        if (version == 1)
                        {
                            stream.WriteByte(0);
                            stream.WriteByte(0);
                        }

                        break;

                    default:
                    {
                    }
                    break;
                    }
                }
            }

            byte[] ptffData = stream.GetData();

            int sizeIn = ptffData.Count();

            if (m_settingsDialog.EncryptFile /*playerData.Encrypted*/)
            {
                ptffData = EncryptDataOnline(ptffData);
                if (ptffData == null || sizeIn != ptffData.Count())
                {
                    return(false);
                }
            }

            File.WriteAllBytes(filename, ptffData);

            return(true);
        }