Beispiel #1
0
 private void DeSerializeCollisionShapeData(XmlElement parent, BulletWriter writer)
 {
     SetIntValue(writer, parent["m_shapeType"], CollisionShapeData.Offset("ShapeType"));
     writer.Write(0, CollisionShapeData.Offset("Name"));
 }
Beispiel #2
0
        private void AutoSerializeRootLevelChildren(XmlElement parent)
        {
            foreach (XmlNode node in parent)
            {
                if (node.NodeType != XmlNodeType.Element)
                {
                    continue;
                }

                XmlElement element = node as XmlElement;
                switch (element.Name)
                {
                case "btCompoundShapeChildData":
                    DeSerializeCompoundShapeChildData(element);
                    continue;

                case "btCompoundShapeData":
                    DeSerializeCompoundShapeData(element);
                    continue;

                case "btConvexHullShapeData":
                    DeSerializeConvexHullShapeData(element);
                    continue;

                case "btConvexInternalShapeData":
                    DeSerializeConvexInternalShapeData(element);
                    continue;

                case "btDynamicsWorldFloatData":
                    DeSerializeDynamicsWorldData(element);
                    continue;

                case "btGeneric6DofConstraintData":
                    DeSerializeGeneric6DofConstraintData(element);
                    continue;

                case "btRigidBodyFloatData":
                    DeSerializeRigidBodyFloatData(element);
                    continue;

                case "btStaticPlaneShapeData":
                    DeSerializeStaticPlaneShapeData(element);
                    continue;

                case "btVector3FloatData":
                    DeSerializeVector3FloatData(element);
                    continue;

                default:
                    throw new NotImplementedException();
                }
            }

            foreach (byte[] shapeData in _collisionShapeData)
            {
                CollisionShape shape = ConvertCollisionShape(shapeData, _pointerLookup);
                if (shape != null)
                {
                    foreach (KeyValuePair <long, byte[]> lib in _pointerLookup)
                    {
                        if (lib.Value == shapeData)
                        {
                            _shapeMap.Add(lib.Key, shape);
                            break;
                        }
                    }

                    using (var stream = new MemoryStream(shapeData, false))
                    {
                        using (var reader = new BulletReader(stream))
                        {
                            long namePtr = reader.ReadPtr(CollisionShapeData.Offset("Name"));
                            if (namePtr != 0)
                            {
                                byte[] nameData = _pointerLookup[namePtr];
                                int    length   = Array.IndexOf(nameData, (byte)0);
                                string name     = System.Text.Encoding.ASCII.GetString(nameData, 0, length);
                                _objectNameMap.Add(shape, name);
                                _nameShapeMap.Add(name, shape);
                            }
                        }
                    }
                }
            }

            foreach (byte[] rbData in _rigidBodyData)
            {
                ConvertRigidBodyFloat(rbData, _pointerLookup);
            }

            foreach (byte[] constraintData in _constraintData)
            {
                //throw new NotImplementedException();
                //ConvertConstraint(constraintData);
            }
        }
Beispiel #3
0
        public bool ConvertAllObjects(BulletFile file)
        {
            _shapeMap.Clear();
            _bodyMap.Clear();

            foreach (byte[] bvhData in file.Bvhs)
            {
                OptimizedBvh bvh = CreateOptimizedBvh();

                if ((file.Flags & FileFlags.DoublePrecision) != 0)
                {
                    throw new NotImplementedException();
                }
                else
                {
                    // QuantizedBvhData is parsed in C++, so we need to set pointers to actual values
                    GCHandle?contiguousNodes          = PinDataAtPointer(bvhData, QuantizedBvhFloatData.Offset("ContiguousNodesPtr"), file);
                    GCHandle?quantizedContiguousNodes = PinDataAtPointer(bvhData, QuantizedBvhFloatData.Offset("QuantizedContiguousNodesPtr"), file);
                    GCHandle?subTreeInfo = PinDataAtPointer(bvhData, QuantizedBvhFloatData.Offset("SubTreeInfoPtr"), file);

                    GCHandle bvhDataHandle    = GCHandle.Alloc(bvhData, GCHandleType.Pinned);
                    IntPtr   bvhDataPinnedPtr = bvhDataHandle.AddrOfPinnedObject();
                    bvh.DeSerializeFloat(bvhDataPinnedPtr);
                    bvhDataHandle.Free();

                    contiguousNodes?.Free();
                    quantizedContiguousNodes?.Free();
                    subTreeInfo?.Free();
                }

                foreach (KeyValuePair <long, byte[]> lib in file.LibPointers)
                {
                    if (lib.Value == bvhData)
                    {
                        _bvhMap.Add(lib.Key, bvh);
                        break;
                    }
                }
            }

            foreach (byte[] shapeData in file.CollisionShapes)
            {
                CollisionShape shape = ConvertCollisionShape(shapeData, file.LibPointers);
                if (shape != null)
                {
                    foreach (KeyValuePair <long, byte[]> lib in file.LibPointers)
                    {
                        if (lib.Value == shapeData)
                        {
                            _shapeMap.Add(lib.Key, shape);
                            break;
                        }
                    }

                    long namePtr = BulletReader.ToPtr(shapeData, CollisionShapeData.Offset("Name"));
                    if (namePtr != 0)
                    {
                        byte[] nameData = file.LibPointers[namePtr];
                        int    length   = Array.IndexOf(nameData, (byte)0);
                        string name     = System.Text.Encoding.ASCII.GetString(nameData, 0, length);
                        _objectNameMap.Add(shape, name);
                        _nameShapeMap.Add(name, shape);
                    }
                }
            }

            foreach (byte[] solverInfoData in file.DynamicsWorldInfo)
            {
                if ((file.Flags & FileFlags.DoublePrecision) != 0)
                {
                    //throw new NotImplementedException();
                }
                else
                {
                    //throw new NotImplementedException();
                }
            }

            foreach (byte[] bodyData in file.RigidBodies)
            {
                if ((file.Flags & FileFlags.DoublePrecision) != 0)
                {
                    ConvertRigidBodyDouble(bodyData, file.LibPointers);
                }
                else
                {
                    ConvertRigidBodyFloat(bodyData, file.LibPointers);
                }
            }

            foreach (byte[] colObjData in file.CollisionObjects)
            {
                using (var colObjStream = new MemoryStream(colObjData, false))
                {
                    using (var colObjReader = new BulletReader(colObjStream))
                    {
                        if ((file.Flags & FileFlags.DoublePrecision) != 0)
                        {
                            long           shapePtr       = colObjReader.ReadPtr(CollisionObjectDoubleData.Offset("CollisionShape"));
                            CollisionShape shape          = _shapeMap[shapePtr];
                            Math.Matrix    startTransform = colObjReader.ReadMatrixDouble(CollisionObjectDoubleData.Offset("WorldTransform"));
                            long           namePtr        = colObjReader.ReadPtr(CollisionObjectDoubleData.Offset("Name"));
                            string         name           = null;
                            if (namePtr != 0)
                            {
                                byte[] nameData = file.FindLibPointer(namePtr);
                                int    length   = Array.IndexOf(nameData, (byte)0);
                                name = System.Text.Encoding.ASCII.GetString(nameData, 0, length);
                            }
                            CollisionObject colObj = CreateCollisionObject(ref startTransform, shape, name);
                            _bodyMap.Add(colObjData, colObj);
                        }
                        else
                        {
                            long           shapePtr       = colObjReader.ReadPtr(CollisionObjectFloatData.Offset("CollisionShape"));
                            CollisionShape shape          = _shapeMap[shapePtr];
                            Math.Matrix    startTransform = colObjReader.ReadMatrix(CollisionObjectFloatData.Offset("WorldTransform"));
                            long           namePtr        = colObjReader.ReadPtr(CollisionObjectFloatData.Offset("Name"));
                            string         name           = null;
                            if (namePtr != 0)
                            {
                                byte[] nameData = file.FindLibPointer(namePtr);
                                int    length   = Array.IndexOf(nameData, (byte)0);
                                name = System.Text.Encoding.ASCII.GetString(nameData, 0, length);
                            }
                            CollisionObject colObj = CreateCollisionObject(ref startTransform, shape, name);
                            _bodyMap.Add(colObjData, colObj);
                        }
                    }
                }
            }

            foreach (byte[] constraintData in file.Constraints)
            {
                RigidBody a = null, b = null;

                long collisionObjectAPtr = BulletReader.ToPtr(constraintData, TypedConstraintFloatData.Offset("RigidBodyA"));
                if (collisionObjectAPtr != 0)
                {
                    if (!file.LibPointers.ContainsKey(collisionObjectAPtr))
                    {
                        a = TypedConstraint.GetFixedBody();
                    }
                    else
                    {
                        byte[] coData = file.LibPointers[collisionObjectAPtr];
                        a = RigidBody.Upcast(_bodyMap[coData]);
                        if (a == null)
                        {
                            a = TypedConstraint.GetFixedBody();
                        }
                    }
                }

                long collisionObjectBPtr = BulletReader.ToPtr(constraintData, TypedConstraintFloatData.Offset("RigidBodyB"));
                if (collisionObjectBPtr != 0)
                {
                    if (!file.LibPointers.ContainsKey(collisionObjectBPtr))
                    {
                        b = TypedConstraint.GetFixedBody();
                    }
                    else
                    {
                        byte[] coData = file.LibPointers[collisionObjectBPtr];
                        b = RigidBody.Upcast(_bodyMap[coData]);
                        if (b == null)
                        {
                            b = TypedConstraint.GetFixedBody();
                        }
                    }
                }

                if (a == null && b == null)
                {
                    continue;
                }

                if ((file.Flags & FileFlags.DoublePrecision) != 0)
                {
                    throw new NotImplementedException();
                }
                else
                {
                    ConvertConstraintFloat(a, b, constraintData, file.Version, file.LibPointers);
                }
            }

            return(true);
        }