コード例 #1
0
ファイル: ObjectInfoBlock.cs プロジェクト: VoidXH/Cavern
        /// <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;
            }
        }
コード例 #2
0
ファイル: ObjectHolder.cs プロジェクト: pb0/ID0_Test
    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);
        }
    }
コード例 #3
0
    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);
    }
コード例 #4
0
ファイル: ObjectInfoBlock.cs プロジェクト: VoidXH/Cavern
        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
        }
コード例 #5
0
ファイル: ObjectHolder.cs プロジェクト: pb0/ID0_Test
 private void DestroyObject()
 {
     if (objectAnchor != null)
     {
         objectAnchor.Destroy();
         objectAnchor = null;
     }
 }