52 lines
1.9 KiB
GDScript
52 lines
1.9 KiB
GDScript
@tool
|
|
extends RefCounted
|
|
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# PLACEment transFORM
|
|
# A pseudo-struct meant to store a placement (initial position), surface normal
|
|
# Final Transform3D and an occupied octree octant (what part of the 2x2x2 cube it's in)
|
|
#
|
|
# Originally was a resource, but after some quick tests, the overhead of having
|
|
# Thousands of Resources as simple containers became apparent
|
|
# It was decided to use an Array as a fastest and most compact built-in container
|
|
#
|
|
# This script provides an function library to more easily construct such arrays
|
|
# And provide access to methods that were formerly part of this Resource
|
|
#-------------------------------------------------------------------------------
|
|
|
|
|
|
# [0] - placement,
|
|
# [1] - surface_normal
|
|
# [2] - transform
|
|
# [3] - octree_octant
|
|
|
|
|
|
static func mk(placement:Vector3 = Vector3(), surface_normal:Vector3 = Vector3(), transform:Transform3D = Transform3D(), octree_octant:int = 0) -> Array:
|
|
return [
|
|
# A designated position for an instance
|
|
placement,
|
|
# A normal of the surface
|
|
surface_normal,
|
|
# An actual transform derived from placement including random offsets, rotations, scaling, etc.
|
|
transform,
|
|
# Occupied octant is mostly used to quick access the child node of an octree node
|
|
# E.g. when aplying PaintingChanges
|
|
octree_octant
|
|
]
|
|
|
|
|
|
static func to_str(placeform: Array) -> String:
|
|
return '[%s, %s, %s, %s, %d]' % [str(placeform[0]), str(placeform[1]), str(placeform[2].basis), str(placeform[2].origin), placeform[3]]
|
|
|
|
|
|
static func get_origin_offset(placeform: Array) -> float:
|
|
var difference = placeform[2].origin - placeform[0]
|
|
var offset = placeform[1].dot(difference.normalized()) * difference.length()
|
|
return offset
|
|
|
|
|
|
static func set_placement_from_origin_offset(placeform: Array, offset: float):
|
|
placeform[0] = placeform[2].origin - placeform[1] * offset
|
|
return placeform
|