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); }
public RaycastResult(SolidObject body, Vector3 normal, Vector3 position, Ray ray) { Body = body; Normal = normal; Position = position; Ray = ray; }
static public void Commit(this SolidObject item, SQLiteConnection connection) { if (item.IsSolidObjectNew()) { } else { } }
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"); } }; }
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; } }
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)); } }
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); }
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); }
static public bool IsSolidObjectNew(this SolidObject item) { item.GetSolidObjectPrimaryKey() }
static public SolidObjectPrimaryKey GetSolidObjectPrimaryKey(this SolidObject item) { return(SOLID_OBJECT_PRIMARY_KEY.Fetch(item.GetType())); }
static public IEnumerable <SolidObjectProperty> GetSolidObjectPropertys(this SolidObject item) { return(SOLID_OBJECT_PROPERTYS.Fetch(item.GetType()).Values); }
static public SolidObjectTable GetSolidObjectTable(this SolidObject item) { return(SOLID_OBJECT_TABLE.Fetch(item.GetType())); }
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); }