Beispiel #1
0
        public static TriggerVolume FromScenarioTriggerVolume(ScenarioTag tag, ScenarioTag.TriggerVolume tvDefinition)
        {
            var ent = new TriggerVolume();

            ent.FriendlyName = tvDefinition.Description;

            var orient = GetOrientation(tvDefinition.Orientation, tvDefinition.OrientationAxis);

            var xform = new TransformComponent(ent, tvDefinition.Position, orient);

            var renderModel = ModelFactory.Cuboid(Vector3.Zero, tvDefinition.Size, new Vector4(1f, 1f, 0f, 0.5f));

            renderModel.Flags       = ModelFlags.IsTransparent;
            renderModel.RenderLayer = RenderLayers.Scripting;

            var wireframeRenderModel = ModelFactory.Cuboid(Vector3.Zero, tvDefinition.Size, new Vector4(1f, 1f, 0f, 1f));

            wireframeRenderModel.Flags       = ModelFlags.Wireframe;
            wireframeRenderModel.RenderLayer = RenderLayers.Scripting;

            ent.SetComponents(xform,
                              TriggerGeometryComponent.Cuboid(ent, xform, tvDefinition.Size, tvDefinition.Description),
                              new RenderModelComponent(ent, renderModel),
                              new RenderModelComponent(ent, wireframeRenderModel));
            return(ent);

            Quaternion GetOrientation(Vector3 angle, Vector3 axis)
            {
                //BUG? The Z value of the angle vector is not used here, and is present in ~5 triggers in the game
                var a = MathF.Atan2(angle.Y, angle.X);

                return(Quaternion.CreateFromAxisAngle(axis, a));
            }
        }
Beispiel #2
0
        public void SetComponents(
            TransformComponent transform,
            TriggerGeometryComponent volume,
            params Component[] rest)
        {
            var allComps = new List <Component>();

            allComps.Add(transform);
            allComps.Add(volume);
            allComps.AddRange(rest);

            base.SetComponents(allComps);
        }
Beispiel #3
0
        public void AddTrigger(TriggerGeometryComponent component)
        {
            var halfSize      = component.Size / 2f;
            var posPose       = Matrix4x4.CreateTranslation(component.Transform.TransformationMatrix.Translation);
            var rot           = Matrix4x4.CreateFromQuaternion(component.Transform.Orientation);
            var posCorrection = Matrix4x4.CreateTranslation(halfSize);

            var body = this.physxPhysics.CreateRigidStatic(posCorrection * rot * posPose);

            body.Name = component.Name;

            Geometry volume = component.Shape switch
            {
                TriggerGeometryShape.Cuboid => new BoxGeometry(halfSize),
            };

            var shape = RigidActorExt.CreateExclusiveShape(body, volume, defaultMat, ShapeFlag.TriggerShape);

            shape.SimulationFilterData = new FilterData((uint)OpenH2FilterData.TriggerVolume, 0, 0, 0);

            body.UserData = component;
            this.physxScene.AddActor(body);
        }
Beispiel #4
0
 private void RemoveTrigger(TriggerGeometryComponent comp)
 {
     // TODO: implement cleaning up triggers
 }