/// <summary> /// Read new information for this block. /// </summary> public void Update(BitExtractor extractor, int blk, bool bedOrISFObject) { bool inactive = extractor.ReadBit(); int basicInfoStatus = inactive ? 0 : (blk == 0 ? 1 : extractor.Read(2)); if ((basicInfoStatus & 1) == 1) { ObjectBasicInfo(extractor, basicInfoStatus == 1); } int renderInfoStatus = 0; if (!inactive && !bedOrISFObject) { renderInfoStatus = blk == 0 ? 1 : extractor.Read(2); } if ((renderInfoStatus & 1) == 1) { ObjectRenderInfo(extractor, blk, renderInfoStatus == 1); } if (extractor.ReadBit()) // Additional table data { extractor.Skip((extractor.Read(4) + 1) * 8); } if (bedOrISFObject) { anchor = ObjectAnchor.Speaker; } }
protected virtual void CreateObject() { objectAnchor = ObjectAnchor.Create(this, Rect, CullingLayer); string[] paths = StringTool.SplitWithDepth(StringTool.RemoveWhiteSpace(ResourcePath), '(', ')', ';'); foreach (var entity in paths) { AttachResource(entity, false); } }
public static bool GetAnchorWithKey(Transform ObjectRoot, string Key, out ObjectAnchor OutObjectAnchor) { bool activeSelf = ObjectRoot.gameObject.activeSelf; ObjectRoot.gameObject.SetActive(true); List <ObjectAnchor> list = new List <ObjectAnchor>(ObjectRoot.GetComponentsInChildren <ObjectAnchor>()); foreach (ObjectAnchor objectAnchor in list) { if (objectAnchor.key == Key) { OutObjectAnchor = objectAnchor; ObjectRoot.gameObject.SetActive(activeSelf); return(true); } } OutObjectAnchor = null; return(false); }
void ObjectRenderInfo(BitExtractor extractor, int blk, bool readAllBlocks) { int blocks = readAllBlocks ? 15 : extractor.Read(4); // Spatial position if (validPosition = (blocks & 8) != 0) { differentialPosition = blk != 0 && extractor.ReadBit(); if (differentialPosition) { position = new Vector3( extractor.ReadSigned(3) * xyScale, extractor.ReadSigned(3) * xyScale, extractor.ReadSigned(3) * zScale ); } else { int posX = extractor.Read(6); int posY = extractor.Read(6); int posZ = ((extractor.ReadBitInt() << 1) - 1) * extractor.Read(4); position = new Vector3( Math.Min(1, posX * xyScale), Math.Min(1, posY * xyScale), Math.Min(1, posZ * zScale) ); } if (extractor.ReadBit()) // Distance specified { if (extractor.ReadBit()) // Infinite distance { distance = 100; // Close enough } else { distance = distanceFactors[extractor.Read(4)]; } } else { distance = float.NaN; } } // Zone constraints - the renderer is not prepared for zoning if ((blocks & 4) != 0) { extractor.Skip(4); } // Scaling if ((blocks & 2) != 0) { size = extractor.Read(2) switch { 0 => 0, 1 => extractor.Read(5) * sizeScale, 2 => (new Vector3(extractor.Read(5), extractor.Read(5), extractor.Read(5)) * sizeScale).Length(), _ => - 1, }; } // Screen anchoring if ((blocks & 1) != 0 && extractor.ReadBit()) { anchor = ObjectAnchor.Screen; screenFactor = (extractor.Read(3) + 1) * .125f; depthFactor = depthFactors[extractor.Read(2)]; } extractor.Skip(1); // Snap to the nearest channel - unused }
private void DestroyObject() { if (objectAnchor != null) { objectAnchor.Destroy(); objectAnchor = null; } }