Module: Jolt::SystemQueries

Included in:
System
Defined in:
lib/jolt/system_queries.rb

Instance Method Summary collapse

Instance Method Details

#overlap_point(point, layer_mask: nil, &block) ⇒ Object



45
46
47
48
49
50
51
52
53
# File 'lib/jolt/system_queries.rb', line 45

def overlap_point(point, layer_mask: nil, &block)
  point_native = Conversions.native_vec3(point, name: "point")
  collect_overlapping_bodies(
    :JPH_BroadPhaseQuery_CollidePoint,
    point_native.pointer,
    layer_mask:,
    &block
  )
end

#overlap_sphere(center, radius, layer_mask: nil, &block) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/jolt/system_queries.rb', line 33

def overlap_sphere(center, radius, layer_mask: nil, &block)
  center_native = Conversions.native_vec3(center, name: "center")
  radius = Conversions.positive_float(radius, "radius")
  collect_overlapping_bodies(
    :JPH_BroadPhaseQuery_CollideSphere,
    center_native.pointer,
    radius,
    layer_mask:,
    &block
  )
end

#raycast(origin:, direction:, layer_mask: nil) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/jolt/system_queries.rb', line 5

def raycast(origin:, direction:, layer_mask: nil)
  __check_alive!
  origin_native = Conversions.native_vec3(origin, name: "origin")
  direction_native = Conversions.native_vec3(direction, name: "direction")
  direction_vector = Conversions.vec3(direction_native)
  if direction_vector.length <= Float::EPSILON
    raise InvalidArgumentError, "direction must not be zero"
  end

  filter, filter_context = object_layer_filter(layer_mask)
  result = Native::RayCastResult.new
  hit = Native.JPH_NarrowPhaseQuery_CastRay(
    @narrow_phase_query,
    origin_native.pointer,
    direction_native.pointer,
    result.pointer,
    nil,
    filter,
    nil
  )
  return nil unless hit

  build_hit(origin_native, direction_native, result)
ensure
  Native.JPH_ObjectLayerFilter_Destroy(filter) if filter && !filter.null?
  filter_context = nil
end