Example #1
0
        internal Oobject CreateNewObject(TreeNode selectedNode, String objectType)
        {
            Inventory currentInventory = TreeNodeDict.GetInventory(selectedNode);
            Oobject   newObject;

            switch (objectType)
            {
            case Oobject.AccessPointObjectType:
                newObject = new AccessPointObject(currentInventory);
                break;

            default:
                newObject = new SolidObject(currentInventory);
                break;
            }


            newObject.Noun.Singular = "New Object";
            //currentInventory.Add(newObject);
            TreeNode childNode = selectedNode.Nodes.Add(newObject.Noun.Singular);

            TreeNodeDict.Add(childNode, newObject);
            fillTreeNode();
            return(newObject);
        }
Example #2
0
 public RaycastResult(SolidObject body, Vector3 normal, Vector3 position, Ray ray)
 {
     Body     = body;
     Normal   = normal;
     Position = position;
     Ray      = ray;
 }
Example #3
0
 static public void Commit(this SolidObject item, SQLiteConnection connection)
 {
     if (item.IsSolidObjectNew())
     {
     }
     else
     {
     }
 }
Example #4
0
    private void Initialize()
    {
        if (m_template == null)
        {
            return;
        }

        m_solidObject = GetComponent <SolidObject>();

        m_currentSpeed = m_template.Speed;

        m_initialized = true;
    }
 public SolidObjectViewModel(SolidObject solidObject)
 {
     _solidObject = solidObject;
     _solidObject.PropertyChanged += (sender, e) =>
     {
         bool positionChanged = e.PropertyName == "Position";
         bool sizeChanged     = e.PropertyName == "Size";
         if (positionChanged)
         {
             FirePropertyChanged("Position");
         }
         if (sizeChanged)
         {
             FirePropertyChanged("Size");
         }
         if (positionChanged || sizeChanged)
         {
             FirePropertyChanged("Bounds");
         }
     };
 }
Example #6
0
        protected override void move(ArrayList solidObjects)
        {
            bool noCollisions = true;

            if (vx != 0 || vy != 0)
            {
                for (int i = 0; i < solidObjects.Count; i++)
                {
                    SolidObject so = (SolidObject)solidObjects[i];

                    if (!so.semiSolid && sprite.checkCollision(so.box, vx, vy) == true)
                    {
                        noCollisions = false;
                        break;
                    }
                }

                if (!noCollisions)
                {
                    vx       = 0;
                    vy       = 0;
                    gravity  = 0;
                    disarmed = true;
                    if (sprite != crack)
                    {
                        crack.x = sprite.x;
                        crack.y = sprite.y;
                        sprite  = crack;
                    }
                }
                else
                {
                    sprite.x += vx;
                    sprite.y += vy;
                }

                vy += gravity;
            }
        }
Example #7
0
        private Color Refract(SolidObject body, Ray refractIn, int refractBounces, int reflectBounces, float maxLength)
        {
            var result = scene.Ray(refractIn, maxLength);

            if (result == null)
            {
                return(Color.White);
            }
            if (result.Body != body)
            {
                return(Color.Black);
            }
            else
            {
                var r    = result.Body.Material.RefractionIndex;
                var cos1 = (float)Math.Max(1, -1 * result.Normal * refractIn.Direction.Normalized);

                var sin2 = (float)Math.Max(1, r * (float)Math.Sqrt(1 - cos1 * cos1));

                var cos2       = (float)Math.Max(1, (float)Math.Sqrt(1 - sin2 * sin2));
                var refractOut = r * refractIn.Direction.Normalized + (r * cos1 - cos2) * result.Normal;
                return(RayTrace(new Ray(result.Position, refractOut), refractBounces, reflectBounces - 1, maxLength));
            }
        }
Example #8
0
        private SolidObject ReadObject(BinaryReader br, long size, SolidObject solidObject = null)
        {
            if (solidObject == null)
            {
                solidObject = new ProStreetObject();
            }

            var endPos = br.BaseStream.Position + size;

            while (br.BaseStream.Position < endPos)
            {
                var chunkId     = br.ReadUInt32();
                var chunkSize   = br.ReadUInt32();
                var chunkEndPos = br.BaseStream.Position + chunkSize;

                if ((chunkId & 0x80000000) == 0x80000000)
                {
                    solidObject = ReadObject(br, chunkSize, solidObject);
                }
                else
                {
                    var padding = 0u;

                    while (br.BaseStream.Position < chunkEndPos && br.ReadUInt32() == 0x11111111)
                    {
                        padding += 4;

                        if (br.BaseStream.Position >= chunkEndPos)
                        {
                            break;
                        }
                    }

                    br.BaseStream.Position -= 4;
                    chunkSize -= padding;

                    switch (chunkId)
                    {
                    case SolidListObjHeadChunk:
                    {
                        _namedMaterials = 0;

                        var header = BinaryUtil.ReadStruct <SolidObjectHeader>(br);
                        var name   = BinaryUtil.ReadNullTerminatedString(br);

                        solidObject.Name     = name;
                        solidObject.Hash     = header.Hash;
                        solidObject.MinPoint = header.BoundsMin;
                        solidObject.MaxPoint = header.BoundsMax;

                        solidObject.Transform = header.Transform;

                        //Debug.Assert(header.Transform == Matrix4x4.Identity);
                        //if (header.Transform != Matrix4x4.Identity)
                        //{
                        //    Debug.WriteLine("Name={0} Transform={1} Flags=0x{2:X4}", name, header.Transform, header.Flags);
                        //}

                        break;
                    }

                    // 12 40 13 00
                    case 0x00134012:
                    {
                        for (var j = 0; j < chunkSize / 8; j++)
                        {
                            var val = br.ReadUInt32();

                            if (val != 0)
                            {
                                solidObject.TextureHashes.Add(val);
                            }

                            br.BaseStream.Position += 4;
                        }

                        break;
                    }

                    case 0x134900:
                    {
                        var descriptor = BinaryUtil.ReadUnmanagedStruct <SolidObjectDescriptor>(br);

                        solidObject.MeshDescriptor = new SolidMeshDescriptor
                        {
                            Flags            = descriptor.Flags,
                            HasNormals       = true,
                            NumIndices       = descriptor.NumTriIndices,
                            NumMats          = descriptor.MaterialShaderCount,
                            NumVertexStreams = descriptor.NumVertexStreams
                        };

                        break;
                    }

                    case 0x00134b02:
                    {
                        var shadingGroupSize = Marshal.SizeOf <SolidObjectShadingGroup>();
                        Debug.Assert(chunkSize % shadingGroupSize == 0);
                        var numMats = chunkSize / shadingGroupSize;

                        for (var j = 0; j < numMats; j++)
                        {
                            var shadingGroup = br.GetStruct <SolidObjectShadingGroup>();

                            solidObject.Materials.Add(new ProStreetMaterial
                                {
                                    Flags             = shadingGroup.Flags,
                                    NumIndices        = shadingGroup.IndicesUsed,
                                    NumVerts          = shadingGroup.VertexBufferUsage / shadingGroup.Flags2[2],
                                    VertexStreamIndex = j,
                                    Hash        = shadingGroup.UnknownId,
                                    TextureHash = solidObject.TextureHashes[shadingGroup.TextureShaderUsage[4]],
                                    EffectId    = shadingGroup.EffectId
                                });

                            solidObject.MeshDescriptor.NumVerts +=
                                shadingGroup.VertexBufferUsage / shadingGroup.Flags2[2];
                        }

                        break;
                    }

                    case 0x134b01:
                    {
                        if (chunkSize > 0)
                        {
                            var vb       = new byte[chunkSize];
                            var readSize = br.Read(vb, 0, vb.Length);
                            Debug.Assert(readSize == chunkSize);

                            solidObject.VertexBuffers.Add(vb);
                        }
                        break;
                    }

                    case 0x134b03:
                    {
                        foreach (var material in solidObject.Materials)
                        {
                            material.Indices = new ushort[material.NumIndices];
                            for (var j = 0; j < material.NumIndices; j++)
                            {
                                material.Indices[j] = br.ReadUInt16();
                            }
                        }

                        break;
                    }

                    case 0x00134c02:
                    {
                        if (chunkSize > 0)
                        {
                            solidObject.Materials[_namedMaterials++].Name =
                                BinaryUtil.ReadNullTerminatedString(br);
                        }
                        break;
                    }

                    default:
                        //Console.WriteLine($"0x{chunkId:X8} [{chunkSize}] @{br.BaseStream.Position}");
                        break;
                    }
                }

                br.BaseStream.Position = chunkEndPos;
            }

            return(solidObject);
        }
Example #9
0
        private SolidObject ReadObject(BinaryReader br, long size, SolidObject solidObject)
        {
            if (solidObject == null)
            {
                solidObject = new Underground2Object();
            }

            var endPos = br.BaseStream.Position + size;

            while (br.BaseStream.Position < endPos)
            {
                var chunkId     = br.ReadUInt32();
                var chunkSize   = br.ReadUInt32();
                var chunkEndPos = br.BaseStream.Position + chunkSize;

                if ((chunkId & 0x80000000) == 0x80000000)
                {
                    solidObject = ReadObject(br, chunkSize, solidObject);
                }
                else
                {
                    var padding = 0u;

                    while (br.ReadUInt32() == 0x11111111)
                    {
                        padding += 4;

                        if (br.BaseStream.Position >= chunkEndPos)
                        {
                            break;
                        }
                    }

                    br.BaseStream.Position -= 4;
                    chunkSize -= padding;

                    switch (chunkId)
                    {
                    case SolidListObjHeadChunk:
                    {
                        _namedMaterials = 0;

                        var header = BinaryUtil.ReadStruct <SolidObjectHeader>(br);
                        var name   = new string(br.ReadChars(0x1C)).Trim('\0');

                        solidObject.Name     = name;
                        solidObject.Hash     = header.Hash;
                        solidObject.MinPoint = header.BoundsMin;
                        solidObject.MaxPoint = header.BoundsMax;

                        solidObject.Transform = header.Transform;

                        break;
                    }

                    // 12 40 13 00
                    case 0x00134012:
                    {
                        for (var j = 0; j < chunkSize / 8; j++)
                        {
                            solidObject.TextureHashes.Add(br.ReadUInt32());
                            br.BaseStream.Position += 4;
                        }

                        break;
                    }

                    case 0x134900:
                    {
                        var descriptor = BinaryUtil.ReadUnmanagedStruct <SolidObjectDescriptor>(br);

                        solidObject.MeshDescriptor = new SolidMeshDescriptor
                        {
                            Flags            = descriptor.Flags,
                            HasNormals       = (descriptor.Flags & 0x0080) != 0,
                            NumIndices       = descriptor.NumTris * 3,
                            NumMats          = descriptor.NumMats,
                            NumVerts         = descriptor.NumVerts,
                            NumVertexStreams = 1
                        };

                        break;
                    }

                    case 0x00134b02:
                    {
                        const int shadingGroupSize = 60;
                        Debug.Assert(chunkSize % shadingGroupSize == 0);
                        var numMats = chunkSize / shadingGroupSize;

                        for (var j = 0; j < numMats; j++)
                        {
                            var shadingGroup = br.GetStruct <SolidObjectShadingGroup>();

                            solidObject.Materials.Add(new Underground2Material
                                {
                                    Flags             = shadingGroup.Flags,
                                    MinPoint          = shadingGroup.BoundsMin,
                                    MaxPoint          = shadingGroup.BoundsMax,
                                    NumIndices        = shadingGroup.Length,
                                    VertexStreamIndex = 0,
                                    TextureHash       = solidObject.TextureHashes[(int)shadingGroup.TextureIndex],
                                });
                        }

                        break;
                    }

                    case 0x134b01:
                    {
                        if (chunkSize > 0)
                        {
                            var vb       = new byte[chunkSize];
                            var readSize = br.Read(vb, 0, vb.Length);
                            Debug.Assert(readSize == chunkSize);

                            solidObject.VertexBuffers.Add(vb);
                        }
                        break;
                    }

                    case 0x134b03:
                    {
                        foreach (var material in solidObject.Materials)
                        {
                            material.Indices = new ushort[material.NumIndices];
                            for (var j = 0; j < material.NumIndices; j++)
                            {
                                material.Indices[j] = br.ReadUInt16();
                            }
                        }

                        break;
                    }

                    case 0x00134c02:
                    {
                        if (chunkSize > 0)
                        {
                            solidObject.Materials[_namedMaterials++].Name =
                                BinaryUtil.ReadNullTerminatedString(br);
                        }
                        break;
                    }

                    default:
                        //Console.WriteLine($"0x{chunkId:X8} [{chunkSize}] @{br.BaseStream.Position}");
                        break;
                    }
                }

                br.BaseStream.Position = chunkEndPos;
            }

            return(solidObject);
        }
Example #10
0
 static public bool IsSolidObjectNew(this SolidObject item)
 {
     item.GetSolidObjectPrimaryKey()
 }
Example #11
0
 static public SolidObjectPrimaryKey GetSolidObjectPrimaryKey(this SolidObject item)
 {
     return(SOLID_OBJECT_PRIMARY_KEY.Fetch(item.GetType()));
 }
Example #12
0
 static public IEnumerable <SolidObjectProperty> GetSolidObjectPropertys(this SolidObject item)
 {
     return(SOLID_OBJECT_PROPERTYS.Fetch(item.GetType()).Values);
 }
Example #13
0
 static public SolidObjectTable GetSolidObjectTable(this SolidObject item)
 {
     return(SOLID_OBJECT_TABLE.Fetch(item.GetType()));
 }
Example #14
0
        private SolidObject ReadObject(BinaryReader br, long size, SolidObject solidObject = null)
        {
            if (solidObject == null)
            {
                solidObject = new CarbonObject();
            }

            var endPos = br.BaseStream.Position + size;

            while (br.BaseStream.Position < endPos)
            {
                var chunkId     = br.ReadUInt32();
                var chunkSize   = br.ReadUInt32();
                var chunkEndPos = br.BaseStream.Position + chunkSize;

                if (chunkSize == 0)
                {
                    continue;
                }

                if ((chunkId & 0x80000000) == 0x80000000)
                {
                    solidObject = ReadObject(br, chunkSize, solidObject);
                }
                else
                {
                    var padding = 0u;

                    while (br.ReadByte() == 0x11)
                    {
                        padding++;
                    }

                    br.BaseStream.Position--;

                    if (padding % 2 != 0)
                    {
                        padding--;
                        br.BaseStream.Position--;
                    }

                    chunkSize -= padding;

                    switch (chunkId)
                    {
                    case SolidListObjHeadChunk:
                    {
                        _namedMaterials = 0;

                        var header = BinaryUtil.ReadStruct <SolidObjectHeader>(br);
                        var name   = BinaryUtil.ReadNullTerminatedString(br);

                        solidObject.Name      = name;
                        solidObject.Hash      = header.Hash;
                        solidObject.MinPoint  = header.BoundsMin;
                        solidObject.MaxPoint  = header.BoundsMax;
                        solidObject.Transform = header.Transform;

                        break;
                    }

                    // 12 40 13 00
                    case 0x00134012:
                    {
                        for (var j = 0; j < chunkSize / 8; j++)
                        {
                            solidObject.TextureHashes.Add(br.ReadUInt32());
                            br.BaseStream.Position += 4;
                        }

                        break;
                    }

                    case 0x134900:
                    {
                        var descriptor = BinaryUtil.ReadUnmanagedStruct <SolidObjectDescriptor>(br);

                        solidObject.MeshDescriptor = new SolidMeshDescriptor
                        {
                            Flags            = descriptor.Flags,
                            HasNormals       = true,
                            NumIndices       = descriptor.NumIndices,
                            NumMats          = descriptor.NumMats,
                            NumVertexStreams = descriptor.NumVertexStreams
                        };

                        break;
                    }

                    case 0x00134b02:
                    {
                        Debug.Assert(chunkSize % 144 == 0);
                        var numMats = chunkSize / 144;

                        var streamIndex  = 0;
                        var lastEffectID = 0u;

                        for (var j = 0; j < numMats; j++)
                        {
                            var shadingGroup = BinaryUtil.ReadStruct <SolidObjectShadingGroup>(br);

                            if (j > 0 && shadingGroup.EffectId != lastEffectID)
                            {
                                streamIndex++;
                            }

                            var solidObjectMaterial = new CarbonMaterial
                            {
                                Flags             = shadingGroup.Flags,
                                NumIndices        = shadingGroup.NumTris * 3,
                                MinPoint          = shadingGroup.BoundsMin,
                                MaxPoint          = shadingGroup.BoundsMax,
                                NumVerts          = shadingGroup.NumVerts,
                                TextureHash       = solidObject.TextureHashes[shadingGroup.TextureNumber[0]],
                                EffectId          = shadingGroup.EffectId,
                                VertexStreamIndex = streamIndex
                            };

                            solidObject.Materials.Add(solidObjectMaterial);

                            solidObject.MeshDescriptor.NumVerts += shadingGroup.NumVerts;
                            lastEffectID = shadingGroup.EffectId;
                        }

                        break;
                    }

                    case 0x134b01:
                    {
                        if (chunkSize > 0)
                        {
                            var vb       = new byte[chunkSize];
                            var readSize = br.Read(vb, 0, vb.Length);
                            Debug.Assert(readSize == chunkSize);

                            solidObject.VertexBuffers.Add(vb);
                        }
                        break;
                    }

                    case 0x134b03:
                    {
                        foreach (var material in solidObject.Materials)
                        {
                            material.Indices = new ushort[material.NumIndices];
                            for (var j = 0; j < material.NumIndices; j++)
                            {
                                material.Indices[j] = br.ReadUInt16();
                            }
                        }

                        break;
                    }

                    case 0x00134c02:
                    {
                        if (chunkSize > 0)
                        {
                            solidObject.Materials[_namedMaterials++].Name =
                                BinaryUtil.ReadNullTerminatedString(br);
                        }
                        break;
                    }

                    default:
                        //Console.WriteLine($"0x{chunkId:X8} [{chunkSize}] @{br.BaseStream.Position}");
                        break;
                    }
                }

                br.BaseStream.Position = chunkEndPos;
            }

            return(solidObject);
        }