Beispiel #1
0
        static void AddPoint(int bitmap, ref vms_vector norm, ref vms_vector p, ref g3s_uvl uvl)
        {
            var uPoint = new UPoint {
                norm = norm, p = p, uvl = uvl
            };
            int idx;

            if (!uPointIdx.TryGetValue(uPoint, out idx))
            {
                uPointIdx[uPoint] = idx = uPoints.Count;
                uPoints.Add(uPoint);
            }
            tris[bitmap].Add(idx);
        }
Beispiel #2
0
        static void DumpModelData(BinaryReader r, List <int> flatColors, int texCount)
        {
            //Debug.Log("Sub start " + r.BaseStream.Position);
            int glow_idx = -1; // only 0 is actually used

            for (PolyOp op; (op = (PolyOp)r.ReadInt16()) != PolyOp.EOF;)
            {
                int        n, s, i, color, bitmap, i1, i2;
                ushort[]   pointIdx;
                g3s_uvl[]  uvls;
                vms_vector v = default(vms_vector), norm = default(vms_vector);
                //vms_vector[] pvs;
                vms_vector oldPointPos;
                g3s_uvl    uvl      = default(g3s_uvl);
                var        startPos = r.BaseStream.Position - 2;
                //Debug.Log(startPos + ": " + op + " ");
                switch (op)
                {
                case PolyOp.DEFPOINTS:
                    n = r.ReadInt16();
                    //pvs = new vms_vector[n];
                    //pvs.Read(r);
                    for (i = 0; i < n; i++)
                    {
                        points[i].Read(r);
                        points[i] += pointPos;
                    }
                    //Debug.Log(n + " " + string.Join(", ", pvs.Select(x => x.ToString()).ToArray()));
                    break;

                case PolyOp.DEFP_START:
                    n = r.ReadInt16();
                    s = r.ReadInt16();
                    r.ReadInt16();     // align
                                       //pvs = new vms_vector[n];
                                       //pvs.Read(r);
                    for (i = 0; i < n; i++)
                    {
                        points[i + s].Read(r);
                        points[i + s] += pointPos;
                    }
                    //Debug.Log(s + " " + n + " " + string.Join(", ", pvs.Select(x => x.ToString()).ToArray()));
                    break;

                case PolyOp.FLATPOLY:
                    n = r.ReadInt16();
                    v.Read(r);
                    norm.Read(r);
                    color    = r.ReadInt16();
                    pointIdx = new ushort[n];
                    pointIdx.Read(r);
                    if ((n & 1) == 0)
                    {
                        r.ReadInt16();     // align
                    }
                    //Debug.Log(v + " " + norm + " c=" + color + " " + n + " " + string.Join(", ", pointIdx.Select(x => x.ToString()).ToArray()));
                    int colIdx = flatColors.IndexOf(color);
                    if (colIdx == -1)
                    {
                        colIdx = flatColors.Count;
                        flatColors.Add(color);
                    }
                    for (i = 2; i < n; i++)
                    {
                        AddPoint(texCount + colIdx, ref norm, ref points[pointIdx[0]], ref uvl);
                        AddPoint(texCount + colIdx, ref norm, ref points[pointIdx[i - 1]], ref uvl);
                        AddPoint(texCount + colIdx, ref norm, ref points[pointIdx[i]], ref uvl);
                    }
                    break;

                case PolyOp.TMAPPOLY:
                    n = r.ReadInt16();
                    v.Read(r);
                    norm.Read(r);
                    bitmap   = r.ReadInt16();
                    pointIdx = new ushort[n];
                    pointIdx.Read(r);
                    if ((n & 1) == 0)
                    {
                        r.ReadInt16();     // align
                    }
                    uvls = new g3s_uvl[n];
                    uvls.Read(r);
                    //Debug.Log(v + " " + norm + " bm=" + bitmap + " " + n + " " + string.Join(", ", pointIdx.Select(x => x.ToString()).ToArray()) + " " + string.Join(", ", uvls.Select(x => x.ToString()).ToArray()));
                    for (i = 2; i < n; i++)
                    {
                        AddPoint(bitmap, ref norm, ref points[pointIdx[0]], ref uvls[0]);
                        AddPoint(bitmap, ref norm, ref points[pointIdx[i - 1]], ref uvls[i - 1]);
                        AddPoint(bitmap, ref norm, ref points[pointIdx[i]], ref uvls[i]);
                    }
                    glow_idx = -1;
                    break;

                case PolyOp.SORTNORM:
                    r.ReadInt16();     // align
                    v.Read(r);
                    norm.Read(r);
                    i1 = r.ReadInt16();
                    i2 = r.ReadInt16();
                    //Debug.Log(v + " " + norm + " " + i1 + " " + i2);
                    var pos = r.BaseStream.Position;
                    r.BaseStream.Position = startPos + i1;
                    DumpModelData(r, flatColors, texCount);
                    r.BaseStream.Position = startPos + i2;
                    DumpModelData(r, flatColors, texCount);
                    r.BaseStream.Position = pos;
                    break;

                case PolyOp.RODBM:
                    bitmap = r.ReadInt16();     // align
                    v.Read(r);
                    i1 = r.ReadInt16();
                    r.ReadInt16();     // align
                    norm.Read(r);
                    i2 = r.ReadInt16();
                    r.ReadInt16();     // align
                    //Debug.Log(v + " " + norm + " " + i1 + " " + i2);
                    break;

                case PolyOp.SUBCALL:
                    i2 = r.ReadInt16();
                    v.Read(r);
                    i1 = r.ReadInt16();
                    r.ReadInt16();     // align
                    //Debug.Log("anim=" + i2 + " " + v + " " + i1);
                    pos = r.BaseStream.Position;
                    r.BaseStream.Position = startPos + i1;
                    oldPointPos           = pointPos;
                    pointPos += v;
                    DumpModelData(r, flatColors, texCount);
                    pointPos = oldPointPos;
                    r.BaseStream.Position = pos;
                    break;

                case PolyOp.GLOW:
                    glow_idx = r.ReadInt16();
                    //Debug.Log(i1.ToString());
                    break;

                default:
                    throw new Exception();
                }
            }
            //Debug.Log("Sub done");
        }
Beispiel #3
0
 public static Vector2 ToVector2(this g3s_uvl uvl)
 {
     return(new Vector3(uvl.u.ToFloat(), uvl.v.ToFloat()));
 }