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)); } }
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); }
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); }
private void RemoveTrigger(TriggerGeometryComponent comp) { // TODO: implement cleaning up triggers }