Beispiel #1
0
        public List <FracturedParticle> fractureSolidClusterAndRemoveFromMappingByPhysicsObject(PhysicsComponent physicsObject)
        {
            List <FracturedParticle> fracturedParticles = new List <FracturedParticle>();

            ulong physicsObjectId = physicsObject.id;

            Trace.Assert(mapping.physicsObjectIdToSolidCluster.ContainsKey(physicsObject.id));
            if (!mapping.physicsObjectIdToSolidCluster.ContainsKey(physicsObject.id))
            {
                return(new List <FracturedParticle>()); // we should never get here, but it's not fatal
            }

            SolidCluster physicsComponentOfMappedObject = mapping.physicsObjectIdToSolidCluster[physicsObject.id];

            // fracture all solids
            foreach (SolidCluster.SolidWithPositionAndRotation iSolidWithPositionAndRotation in physicsComponentOfMappedObject.solids)
            {
                fracturedParticles.AddRange(fractureSolidWithPositionAndRotation(physicsObject.position, physicsObject.rotation, iSolidWithPositionAndRotation));
            }


            mapping.physicsObjectIdToSolidCluster.Remove(physicsObject.id);

            return(fracturedParticles);
        }
Beispiel #2
0
        SolidCluster buildSolidCluster(GameObjectTemplate template)
        {
            SolidCluster solidCluster = new SolidCluster();

            if (template.solids == null)
            {
                return(solidCluster);
            }

            foreach (serialization.Solid iSolid in template.solids)
            {
                SpatialVectorDouble solidSize = new SpatialVectorDouble(iSolid.size);
                double massOfSolidInKilogram  = iSolid.fractionMass;
                IList <CompositionFraction> solidCompositionFractions = new List <CompositionFraction>()
                {
                    new CompositionFraction(new Isotope(iSolid.fractionIsotopeName), massOfSolidInKilogram)
                };
                Composition solidComposition = new Composition(solidCompositionFractions);

                physics.solid.Solid solid = physics.solid.Solid.makeBox(solidComposition, solidSize);

                SpatialVectorDouble solidLocalPosition = new SpatialVectorDouble(iSolid.localPosition);
                SpatialVectorDouble solidLocalRotation = new SpatialVectorDouble(iSolid.localRotation);

                solidCluster.solids.Add(new SolidCluster.SolidWithPositionAndRotation(solid, solidLocalPosition, solidLocalRotation));
            }

            return(solidCluster);
        }
Beispiel #3
0
        // doesn't add the entity to the entity manager
        public Entity buildFromTemplate(GameObjectTemplate template, SpatialVectorDouble globalPosition, SpatialVectorDouble globalVelocity)
        {
            IList <IComponent> entityComponents = new List <IComponent>();



            PhysicsComponent physicsComponent = buildPhysicsComponentOfMainbody(template, globalPosition, globalVelocity);

            entityComponents.Add(physicsComponent);
            IList <ColliderComponent> colliderComponents = buildColliderComponents(template);

            // add physicsComponent with colliders to physics world
            physicsEngine.physicsAndMeshPairs.Add(new PhysicsComponentAndCollidersPair(physicsComponent, colliderComponents));

            // add solids
            SolidCluster solidCluster = buildSolidCluster(template);

            if (solidCluster.solids.Count > 0)
            {
                solidResponsibility.mapping.physicsObjectIdToSolidCluster[physicsComponent.id] = solidCluster;
            }

            // add effects
            IList <game.responsibilities.Effect> effects = buildEffects(template);

            if (effects.Count > 0)
            {
                effectResponsibility.physicsObjectIdToEffects[physicsComponent.id] = effects;
            }

            // add special attributes
            buildSpecialAttributes(template, entityComponents);

            // add thrusters and recalculate thruster angular rotation cache
            buildThrustersAndAddToObjectAndRecalcThrusterRelatedCache(template, physicsComponent);

            // add rendering mesh
            buildAndAddRenderingMesh(template, physicsComponent);



            // misc

            // PID controller configuration
            readPidControllerConfiguration(template, physicsComponent.id);



            return(Entity.make(entityComponents));
        }