Пример #1
0
 public AMobileEntity( Vector3 location )
     : base(location)
 {
     velocity = new Vector3();
     impulses = new List<AImpulse>();
     physics = PhysicsProperties.BasicBody;
 }
Пример #2
0
            public void OnPassThrough(
                PhysicsProperties properties,
                ref Vector2 position,
                ref Vector2 velocity,
                ref float angularVelocity,
                ref BallPassThroughEvent collision)
            {
                switch (collision.Type)
                {
                case BallPassThroughType.Water:
                    velocity        *= 0.91f;
                    angularVelocity *= 0.91f;
                    break;

                case BallPassThroughType.Honey:
                    velocity        *= 0.8f;
                    angularVelocity *= 0.8f;
                    break;

                case BallPassThroughType.Tile:
                    TileMaterial byTileId = TileMaterials.GetByTileId(collision.Tile.type);
                    velocity        *= byTileId.GolfPhysics.PassThroughDampening;
                    angularVelocity *= byTileId.GolfPhysics.PassThroughDampening;
                    break;
                }
            }
Пример #3
0
 /// <summary>
 /// Default constructor
 /// </summary>
 public Primitive()
 {
     Flexible     = new FlexibleData();
     Light        = new LightData();
     LightMap     = new LightImage();
     Sculpt       = new SculptData();
     PrimData     = new ConstructionData();
     PhysicsProps = new PhysicsProperties();
 }
Пример #4
0
    private void OnEnable()
    {
        objGravitate         = GetComponent <Gravitate>();
        objRigidbody         = GetComponent <Rigidbody2D>();
        objPhysicsProperties = GetComponent <PhysicsProperties>();
        objOrbitTracker      = GetComponent <OrbitTracker>();

        Managers.ObjectTracker.Instance.RegisterObject(this);
    }
Пример #5
0
            public void OnCollision(
                PhysicsProperties properties,
                ref Vector2 position,
                ref Vector2 velocity,
                ref BallCollisionEvent collision)
            {
                TileMaterial byTileId  = TileMaterials.GetByTileId(collision.Tile.type);
                Vector2      vector2_1 = velocity * byTileId.GolfPhysics.SideImpactDampening;
                Vector2      vector2_2 = collision.Normal * Vector2.Dot(velocity, collision.Normal) * (byTileId.GolfPhysics.DirectImpactDampening - byTileId.GolfPhysics.SideImpactDampening);

                velocity = vector2_1 + vector2_2;
                Projectile entity = collision.Entity as Projectile;

                switch (collision.Tile.type)
                {
                case 421:
                case 422:
                    float   num1      = 2.5f * collision.TimeScale;
                    Vector2 vector2_3 = new Vector2(-collision.Normal.Y, collision.Normal.X);
                    if (collision.Tile.type == (ushort)422)
                    {
                        vector2_3 = -vector2_3;
                    }
                    float num2 = Vector2.Dot(velocity, vector2_3);
                    if ((double)num2 < (double)num1)
                    {
                        velocity += vector2_3 * MathHelper.Clamp(num1 - num2, 0.0f, num1 * 0.5f);
                        break;
                    }
                    break;

                case 476:
                    float num3 = velocity.Length() / collision.TimeScale;
                    if ((double)collision.Normal.Y <= -0.00999999977648258 && (double)num3 <= 100.0)
                    {
                        velocity *= 0.0f;
                        if (entity != null && entity.active)
                        {
                            this.PutBallInCup(entity, collision);
                            break;
                        }
                        break;
                    }
                    break;
                }
                if (entity == null || (double)velocity.Y >= -0.300000011920929 || ((double)velocity.Y <= -2.0 || (double)velocity.Length() <= 1.0))
                {
                    return;
                }
                Dust dust = Dust.NewDustPerfect(collision.Entity.Center, 31, new Vector2?(collision.Normal), (int)sbyte.MaxValue, new Color(), 1f);

                dust.scale    = 0.7f;
                dust.fadeIn   = 1f;
                dust.velocity = dust.velocity * 0.5f + Main.rand.NextVector2CircularEdge(0.5f, 0.4f);
            }
Пример #6
0
        public override string ToString()
        {
            StringBuilder __sb = new StringBuilder("MSceneObjectUpdate(");

            __sb.Append(", ID: ");
            __sb.Append(ID);
            if (Name != null && __isset.Name)
            {
                __sb.Append(", Name: ");
                __sb.Append(Name);
            }
            if (Transform != null && __isset.Transform)
            {
                __sb.Append(", Transform: ");
                __sb.Append(Transform == null ? "<null>" : Transform.ToString());
            }
            if (Collider != null && __isset.Collider)
            {
                __sb.Append(", Collider: ");
                __sb.Append(Collider == null ? "<null>" : Collider.ToString());
            }
            if (Mesh != null && __isset.Mesh)
            {
                __sb.Append(", Mesh: ");
                __sb.Append(Mesh == null ? "<null>" : Mesh.ToString());
            }
            if (PhysicsProperties != null && __isset.PhysicsProperties)
            {
                __sb.Append(", PhysicsProperties: ");
                __sb.Append(PhysicsProperties == null ? "<null>" : PhysicsProperties.ToString());
            }
            if (HandPoses != null && __isset.HandPoses)
            {
                __sb.Append(", HandPoses: ");
                __sb.Append(HandPoses);
            }
            if (Properties != null && __isset.Properties)
            {
                __sb.Append(", Properties: ");
                __sb.Append(Properties);
            }
            if (Attachments != null && __isset.Attachments)
            {
                __sb.Append(", Attachments: ");
                __sb.Append(Attachments);
            }
            if (Constraints != null && __isset.Constraints)
            {
                __sb.Append(", Constraints: ");
                __sb.Append(Constraints);
            }
            __sb.Append(")");
            return(__sb.ToString());
        }
Пример #7
0
    public void ApplyGravity(Gravitate objToGravitate)
    {
        Rigidbody2D rbToGravitate = objToGravitate.objSpaceObj.objRigidbody;

        Vector2 direction       = objSpaceObj.objRigidbody.position - rbToGravitate.position;
        float   distanceSquared = direction.sqrMagnitude;

        float distanceFromCenter = (objPhysicsProperties.Radius + objToGravitate.objPhysicsProperties.Radius);

        //Debug.Log("Dist from center: " + distanceFromCenter + " | Distance: " + direction.magnitude);

        if (direction.magnitude > distanceFromCenter)
        {
            float   gravitationMag = G * (objSpaceObj.objRigidbody.mass * rbToGravitate.mass) / distanceSquared;
            Vector2 force          = direction.normalized * gravitationMag;

            rbToGravitate.AddRelativeForce(force, ForceMode2D.Force);

            if (force.SqrMagnitude() > MIN_THRESHOLD)
            {
                if (!gravitatingObjects.Contains(objToGravitate))
                {
                    gravitatingObjects.Add(objToGravitate);

                    if (objSpaceObj.objRigidbody.mass >= objToGravitate.objSpaceObj.objRigidbody.mass)
                    {
                        if (OnObjectEnteredGravitationalPull != null)
                        {
                            OnObjectEnteredGravitationalPull(objSpaceObj, objToGravitate.objSpaceObj);
                        }
                    }
                }
            }
            else if (gravitatingObjects.Contains(objToGravitate))
            {
                gravitatingObjects.Remove(objToGravitate);

                if (OnObjectExitedGravitationalPull != null)
                {
                    if (objSpaceObj.objRigidbody.mass >= objToGravitate.objSpaceObj.objRigidbody.mass)
                    {
                        Debug.Log("OUT OF GRAVITATIONAL RANGE");
                        OnObjectExitedGravitationalPull(objSpaceObj, objToGravitate.objSpaceObj);
                    }
                }
            }
        }
        else
        {
            //Absorb!
            PhysicsProperties.AbsorbObject(objSpaceObj, objToGravitate.objSpaceObj);
        }
    }
Пример #8
0
            public void OnCollision(PhysicsProperties properties, Vector2 position, Vector2 velocity, BallCollisionEvent collision)
            {
                TileMaterial byTileId = TileMaterials.GetByTileId(collision.Tile.type);
                Vector2      value    = velocity * byTileId.GolfPhysics.SideImpactDampening;
                Vector2      value2   = collision.Normal * Vector2.Dot(velocity, collision.Normal) * (byTileId.GolfPhysics.DirectImpactDampening - byTileId.GolfPhysics.SideImpactDampening);

                velocity = value + value2;
                Projectile projectile = collision.Entity as Projectile;

                switch (collision.Tile.type)
                {
                case 421:
                case 422:
                {
                    float   num2   = 2.5f * collision.TimeScale;
                    Vector2 vector = new Vector2(0f - collision.Normal.Y, collision.Normal.X);
                    if (collision.Tile.type == 422)
                    {
                        vector = -vector;
                    }
                    float num3 = Vector2.Dot(velocity, vector);
                    if (num3 < num2)
                    {
                        velocity += vector * MathHelper.Clamp(num2 - num3, 0f, num2 * 0.5f);
                    }
                    break;
                }

                case 476:
                {
                    float num = velocity.Length() / collision.TimeScale;
                    if (!(collision.Normal.Y > -0.01f) && !(num > 100f))
                    {
                        velocity *= 0f;
                        if (projectile != null && projectile.active)
                        {
                            PutBallInCup(projectile, collision);
                        }
                    }
                    break;
                }
                }
                if (projectile != null && velocity.Y < -0.3f && velocity.Y > -2f && velocity.Length() > 1f)
                {
                    Dust dust = Dust.NewDustPerfect(collision.Entity.Center, 31, collision.Normal, 127);
                    dust.scale    = 0.7f;
                    dust.fadeIn   = 1f;
                    dust.velocity = dust.velocity * 0.5f + Main.rand.NextVector2CircularEdge(0.5f, 0.4f);
                }
            }
    // Adjust physics components of lifted GameObject if confirmed liftable
    void PrepForManipulation()
    {
        PhysicsProperties ppLifted = objectLifted.GetComponent <PhysicsProperties>();

        if (!ppLifted || !ppLifted.liftable)
        {
            objectLifted = null;
            return;             // GameObject was not liftable
        }

        rbLifted                 = objectLifted.GetComponent <Rigidbody>();
        rbLifted.velocity        = Vector3.zero;
        rbLifted.angularVelocity = Vector3.zero;
        rbLifted.useGravity      = false;

        colliderLifted         = objectLifted.GetComponent <Collider>();
        colliderLifted.enabled = false;

        currentLiftDist = startLiftDist;
        objectLifted.transform.position = transform.position + (transform.forward * currentLiftDist);
        objectLifted.transform.parent   = this.transform;       // Preserves relativity of rotation when Lifter looks around
    }
Пример #10
0
 public void Write(TProtocol oprot)
 {
     oprot.IncrementRecursionDepth();
     try
     {
         TStruct struc = new TStruct("MSceneObject");
         oprot.WriteStructBegin(struc);
         TField field = new TField();
         if (ID == null)
         {
             throw new TProtocolException(TProtocolException.INVALID_DATA, "required field ID not set");
         }
         field.Name = "ID";
         field.Type = TType.String;
         field.ID   = 1;
         oprot.WriteFieldBegin(field);
         oprot.WriteString(ID);
         oprot.WriteFieldEnd();
         if (Name == null)
         {
             throw new TProtocolException(TProtocolException.INVALID_DATA, "required field Name not set");
         }
         field.Name = "Name";
         field.Type = TType.String;
         field.ID   = 2;
         oprot.WriteFieldBegin(field);
         oprot.WriteString(Name);
         oprot.WriteFieldEnd();
         if (Transform == null)
         {
             throw new TProtocolException(TProtocolException.INVALID_DATA, "required field Transform not set");
         }
         field.Name = "Transform";
         field.Type = TType.Struct;
         field.ID   = 3;
         oprot.WriteFieldBegin(field);
         Transform.Write(oprot);
         oprot.WriteFieldEnd();
         if (Collider != null && __isset.Collider)
         {
             field.Name = "Collider";
             field.Type = TType.Struct;
             field.ID   = 4;
             oprot.WriteFieldBegin(field);
             Collider.Write(oprot);
             oprot.WriteFieldEnd();
         }
         if (Mesh != null && __isset.Mesh)
         {
             field.Name = "Mesh";
             field.Type = TType.Struct;
             field.ID   = 5;
             oprot.WriteFieldBegin(field);
             Mesh.Write(oprot);
             oprot.WriteFieldEnd();
         }
         if (PhysicsProperties != null && __isset.PhysicsProperties)
         {
             field.Name = "PhysicsProperties";
             field.Type = TType.Struct;
             field.ID   = 6;
             oprot.WriteFieldBegin(field);
             PhysicsProperties.Write(oprot);
             oprot.WriteFieldEnd();
         }
         if (Properties != null && __isset.Properties)
         {
             field.Name = "Properties";
             field.Type = TType.Map;
             field.ID   = 8;
             oprot.WriteFieldBegin(field);
             {
                 oprot.WriteMapBegin(new TMap(TType.String, TType.String, Properties.Count));
                 foreach (string _iter123 in Properties.Keys)
                 {
                     oprot.WriteString(_iter123);
                     oprot.WriteString(Properties[_iter123]);
                 }
                 oprot.WriteMapEnd();
             }
             oprot.WriteFieldEnd();
         }
         if (Attachments != null && __isset.Attachments)
         {
             field.Name = "Attachments";
             field.Type = TType.List;
             field.ID   = 9;
             oprot.WriteFieldBegin(field);
             {
                 oprot.WriteListBegin(new TList(TType.Struct, Attachments.Count));
                 foreach (MAttachment _iter124 in Attachments)
                 {
                     _iter124.Write(oprot);
                 }
                 oprot.WriteListEnd();
             }
             oprot.WriteFieldEnd();
         }
         if (Constraints != null && __isset.Constraints)
         {
             field.Name = "Constraints";
             field.Type = TType.List;
             field.ID   = 10;
             oprot.WriteFieldBegin(field);
             {
                 oprot.WriteListBegin(new TList(TType.Struct, Constraints.Count));
                 foreach (MMIStandard.MConstraint _iter125 in Constraints)
                 {
                     _iter125.Write(oprot);
                 }
                 oprot.WriteListEnd();
             }
             oprot.WriteFieldEnd();
         }
         oprot.WriteFieldStop();
         oprot.WriteStructEnd();
     }
     finally
     {
         oprot.DecrementRecursionDepth();
     }
 }
Пример #11
0
        public void Execute(PhysxScene scene)
        {
            bool isPhysical = (_flags & PhysicsScene.AddPrimShapeFlags.Physical) != 0;

            if (_rootHasVdSet)
            {
                isPhysical = false;
            }

            if (_newPrimaryShape == null)
            {
                bool first = true;
                foreach (BulkShapeData shape in _shapes)
                {
                    BulkShapeData   thisShape = shape;
                    SceneObjectPart thisPart  = (SceneObjectPart)thisShape.Part;
                    String          primName  = String.Empty;
                    if (thisPart != null)
                    {
                        primName = thisPart.Name;
                    }
                    if (first)
                    {
                        _primaryShapeData = thisShape;
                        PhysicsProperties properties = PhysicsProperties.DeserializeOrCreateNew(scene, shape.Material, shape.PhysicsProperties);
                        _rootHasVdSet = properties.VolumeDetectActive;

                        if (_rootHasVdSet)
                        {
                            isPhysical = false;
                        }

                        scene.MeshingStageImpl.QueueForMeshing(primName, shape.Pbs, shape.Size, Meshing.MeshingStage.SCULPT_MESH_LOD,
                                                               isPhysical || _rootHasVdSet, shape.SerializedShapes,
                                                               (_flags& PhysxScene.AddPrimShapeFlags.FromCrossing) == PhysicsScene.AddPrimShapeFlags.FromCrossing,
                                                               delegate(PhysicsShape meshedShape)
                        {
                            _newPrimaryShape = meshedShape;
                            _meshedShapes.Add(thisShape, meshedShape);
                            if (++_meshedSoFar == _totalNumShapes)
                            {
                                scene.QueueCommand(this);
                            }
                        }
                                                               );

                        first = false;
                    }
                    else
                    {
                        scene.MeshingStageImpl.QueueForMeshing(primName, shape.Pbs, shape.Size, Meshing.MeshingStage.SCULPT_MESH_LOD,
                                                               isPhysical || _rootHasVdSet, shape.SerializedShapes,
                                                               (_flags& PhysxScene.AddPrimShapeFlags.FromCrossing) == PhysicsScene.AddPrimShapeFlags.FromCrossing,
                                                               delegate(PhysicsShape meshedShape)
                        {
                            _meshedShapes.Add(thisShape, meshedShape);
                            if (++_meshedSoFar == _totalNumShapes)
                            {
                                scene.QueueCommand(this);
                            }
                        }
                                                               );
                    }
                }
            }
            else
            {
                OpenMetaverse.Vector3 rootVelocity        = OpenMetaverse.Vector3.Zero;
                OpenMetaverse.Vector3 rootAngularVelocity = OpenMetaverse.Vector3.Zero;

                //we have all the shapes for the parent and all children, time to construct the group
                bool      first    = true;
                PhysxPrim rootPrim = null;

                CollisionGroupFlag collisionGroup = (_flags & PhysicsScene.AddPrimShapeFlags.Phantom) == 0 ? CollisionGroupFlag.Normal : CollisionGroupFlag.PhysicalPhantom;
                foreach (BulkShapeData shape in _shapes)
                {
                    if (first)
                    {
                        bool kinematicStatic;

                        PhysicsProperties properties = PhysicsProperties.DeserializeOrCreateNew(scene, shape.Material, shape.PhysicsProperties);

                        PhysX.RigidActor actor = PhysxActorFactory.CreateProperInitialActor(_newPrimaryShape, scene, shape.Position, shape.Rotation, _flags, out kinematicStatic,
                                                                                            properties.PhysxMaterial);

                        rootPrim = new PhysxPrim(scene, shape.Pbs, shape.Position, shape.Rotation, _newPrimaryShape, actor,
                                                 isPhysical, properties, collisionGroup);

                        scene.AddPrimSync(rootPrim, isPhysical, kinematicStatic);

                        shape.OutActor = rootPrim;

                        rootVelocity        = shape.Velocity;
                        rootAngularVelocity = shape.AngularVelocity;

                        first = false;
                    }
                    else
                    {
                        PhysicsShape phyShape = _meshedShapes[shape];

                        PhysicsProperties properties = PhysicsProperties.DeserializeOrCreateNew(scene, shape.Material, shape.PhysicsProperties);

                        PhysxPrim childPrim = new PhysxPrim(rootPrim, scene, shape.Pbs, shape.Position, shape.Rotation, phyShape,
                                                            null, isPhysical, properties, collisionGroup);
                        rootPrim.LinkPrimAsChildSync(phyShape, childPrim, shape.Position, shape.Rotation, true);

                        shape.OutActor = childPrim;
                    }
                }

                rootPrim.UpdateMassAndInertia();

                if (_rootHasVdSet)
                {
                    rootPrim.SetVolumeDetectSync(_rootHasVdSet);
                }

                if ((_flags & PhysicsScene.AddPrimShapeFlags.StartSuspended) != 0)
                {
                    rootPrim.SuspendPhysicsSync(_primaryShapeData.ObjectReceivedOn);
                }

                rootPrim.DynamicsPostcheck();

                rootPrim.SetInitialVelocities(rootVelocity, rootAngularVelocity);

                if ((_flags & PhysicsScene.AddPrimShapeFlags.Interpolate) != 0)
                {
                    rootPrim.SuspendPhysicsSync(_primaryShapeData.ObjectReceivedOn);
                    rootPrim.ResumePhysicsSync(true);
                }

                FinishedEvent.Set();
            }
        }
Пример #12
0
 private void Start()
 {
     objSpaceObj          = GetComponent <SpaceObject>();
     objPhysicsProperties = GetComponent <PhysicsProperties>();
 }
Пример #13
0
 public void Write(TProtocol oprot)
 {
     oprot.IncrementRecursionDepth();
     try
     {
         TStruct struc = new TStruct("MSceneObjectUpdate");
         oprot.WriteStructBegin(struc);
         TField field = new TField();
         if (ID == null)
         {
             throw new TProtocolException(TProtocolException.INVALID_DATA, "required field ID not set");
         }
         field.Name = "ID";
         field.Type = TType.String;
         field.ID   = 1;
         oprot.WriteFieldBegin(field);
         oprot.WriteString(ID);
         oprot.WriteFieldEnd();
         if (Name != null && __isset.Name)
         {
             field.Name = "Name";
             field.Type = TType.String;
             field.ID   = 2;
             oprot.WriteFieldBegin(field);
             oprot.WriteString(Name);
             oprot.WriteFieldEnd();
         }
         if (Transform != null && __isset.Transform)
         {
             field.Name = "Transform";
             field.Type = TType.Struct;
             field.ID   = 3;
             oprot.WriteFieldBegin(field);
             Transform.Write(oprot);
             oprot.WriteFieldEnd();
         }
         if (Collider != null && __isset.Collider)
         {
             field.Name = "Collider";
             field.Type = TType.Struct;
             field.ID   = 4;
             oprot.WriteFieldBegin(field);
             Collider.Write(oprot);
             oprot.WriteFieldEnd();
         }
         if (Mesh != null && __isset.Mesh)
         {
             field.Name = "Mesh";
             field.Type = TType.Struct;
             field.ID   = 5;
             oprot.WriteFieldBegin(field);
             Mesh.Write(oprot);
             oprot.WriteFieldEnd();
         }
         if (PhysicsProperties != null && __isset.PhysicsProperties)
         {
             field.Name = "PhysicsProperties";
             field.Type = TType.Struct;
             field.ID   = 6;
             oprot.WriteFieldBegin(field);
             PhysicsProperties.Write(oprot);
             oprot.WriteFieldEnd();
         }
         if (HandPoses != null && __isset.HandPoses)
         {
             field.Name = "HandPoses";
             field.Type = TType.List;
             field.ID   = 7;
             oprot.WriteFieldBegin(field);
             {
                 oprot.WriteListBegin(new TList(TType.Struct, HandPoses.Count));
                 foreach (MMIStandard.MHandPose _iter138 in HandPoses)
                 {
                     _iter138.Write(oprot);
                 }
                 oprot.WriteListEnd();
             }
             oprot.WriteFieldEnd();
         }
         if (Properties != null && __isset.Properties)
         {
             field.Name = "Properties";
             field.Type = TType.List;
             field.ID   = 8;
             oprot.WriteFieldBegin(field);
             {
                 oprot.WriteListBegin(new TList(TType.Struct, Properties.Count));
                 foreach (MPropertyUpdate _iter139 in Properties)
                 {
                     _iter139.Write(oprot);
                 }
                 oprot.WriteListEnd();
             }
             oprot.WriteFieldEnd();
         }
         if (Attachments != null && __isset.Attachments)
         {
             field.Name = "Attachments";
             field.Type = TType.List;
             field.ID   = 9;
             oprot.WriteFieldBegin(field);
             {
                 oprot.WriteListBegin(new TList(TType.Struct, Attachments.Count));
                 foreach (MAttachment _iter140 in Attachments)
                 {
                     _iter140.Write(oprot);
                 }
                 oprot.WriteListEnd();
             }
             oprot.WriteFieldEnd();
         }
         if (Constraints != null && __isset.Constraints)
         {
             field.Name = "Constraints";
             field.Type = TType.List;
             field.ID   = 10;
             oprot.WriteFieldBegin(field);
             {
                 oprot.WriteListBegin(new TList(TType.Struct, Constraints.Count));
                 foreach (MMIStandard.MConstraint _iter141 in Constraints)
                 {
                     _iter141.Write(oprot);
                 }
                 oprot.WriteListEnd();
             }
             oprot.WriteFieldEnd();
         }
         oprot.WriteFieldStop();
         oprot.WriteStructEnd();
     }
     finally
     {
         oprot.DecrementRecursionDepth();
     }
 }
Пример #14
0
        public void Execute(PhysxScene scene)
        {
            if (Shape == null)
            {
                PhysicsProperties properties = PhysicsProperties.DeserializeOrCreateNew(scene, _material, _serializedPhysicsProperties);
                _hasVdSet = properties.VolumeDetectActive;

                scene.MeshingStageImpl.QueueForMeshing(_primName, _pbs, _size, _lod,
                                                       (_flags& PhysicsScene.AddPrimShapeFlags.Physical) != 0 || _hasVdSet,
                                                       _serializedPhysicsShapes,
                                                       (_flags& PhysxScene.AddPrimShapeFlags.FromCrossing) == PhysicsScene.AddPrimShapeFlags.FromCrossing,
                                                       delegate(PhysicsShape meshedShape)
                {
                    Shape = meshedShape;
                    scene.QueueCommand(this);
                }
                                                       );
            }
            else
            {
                bool isPhysical = (_flags & PhysicsScene.AddPrimShapeFlags.Physical) != 0;
                if (_hasVdSet)
                {
                    isPhysical = false;
                }

                CollisionGroupFlag collisionGroup = (_flags & PhysicsScene.AddPrimShapeFlags.Phantom) == 0 ? CollisionGroupFlag.Normal : CollisionGroupFlag.PhysicalPhantom;
                if (_parent == null)
                {
                    bool kinematicStatic;

                    PhysicsProperties properties = PhysicsProperties.DeserializeOrCreateNew(scene, _material, _serializedPhysicsProperties);

                    Actor = PhysxActorFactory.CreateProperInitialActor(Shape, scene, _position, _rotation, _flags, out kinematicStatic, properties.PhysxMaterial);

                    FinalPrim = new PhysxPrim(scene, _pbs, _position, _rotation, Shape, Actor, isPhysical, properties, collisionGroup);
                    scene.AddPrimSync(FinalPrim, isPhysical, kinematicStatic);
                }
                else
                {
                    PhysicsProperties properties = PhysicsProperties.DeserializeOrCreateNew(scene, _material, _serializedPhysicsProperties);

                    FinalPrim = new PhysxPrim(_parent, scene, _pbs, _position, _rotation, Shape, null, isPhysical, properties, collisionGroup);
                    _parent.LinkPrimAsChildSync(Shape, FinalPrim, _position, _rotation, false);
                }

                if (_hasVdSet)
                {
                    FinalPrim.SetVolumeDetectSync(true);
                }

                if ((_flags & PhysicsScene.AddPrimShapeFlags.StartSuspended) != 0)
                {
                    FinalPrim.SuspendPhysicsSync(_interpolateTime);
                }

                FinalPrim.DynamicsPostcheck();

                FinalPrim.SetInitialVelocities(_velocity, _angularVelocity);

                if ((_flags & PhysicsScene.AddPrimShapeFlags.Interpolate) != 0)
                {
                    FinalPrim.SuspendPhysicsSync(_interpolateTime);
                    FinalPrim.ResumePhysicsSync(true);
                }

                this.FinshedEvent.Set();
            }
        }