You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/WhiteBox/Editor/Scripts/Staircase.py

99 lines
4.1 KiB
Python

"""
Copyright (c) Contributors to the Open 3D Engine Project
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
import WhiteBoxMath as whiteBoxMath
import WhiteBoxInit as init
import argparse
import azlmbr.legacy.general as general
import azlmbr.bus as bus
import azlmbr.whitebox.api as api
# usage: pyRunFile path/to/file/staircase.py <steps> <depth> <height> <width>
# formula to determine the new amount of faces added with each polygon translation
def faces_added(step):
return (step + 2) * 4
# returns the face handles used to make the top back block, used for extruding upward
def top_back_face_handle(num_faces):
return api.FaceHandle(num_faces - 4)
# determines the edge that needs to be hidden at the back of the staircase
# next edge seems to related to prev edge by the recursive sequence e(n+1) = e(n)+20+6*n
def edge_to_hide(prev_edge, step):
if step == 0:
return 20
return prev_edge + 20 + 6 * step
def create_staircase_from_white_box_mesh(whiteBoxMesh, num_steps, depth, height, width):
# number of faces the mesh starts with
curr_faces = 12
# backmost face of the white box mesh, this will be extruded to add new steps for the staircase
back_face = api.FaceHandle(10)
# backmost face of the white box mesh, this will be extruded to add width to the staircase
side_face = api.FaceHandle(5)
# change the default whiteBoxMesh which will act as the first step to the staircase
if height != 1.0 and height > 0.0:
offset = height - 1.0
top_polygon = whiteBoxMesh.FacePolygonHandle(azlmbr.object.construct('FaceHandle', 0))
whiteBoxMesh.TranslatePolygon(top_polygon, offset)
if depth != 1.0 and depth > 0.0:
offset = depth - 1.0
back_polygon = whiteBoxMesh.FacePolygonHandle(back_face)
whiteBoxMesh.TranslatePolygon(back_polygon, offset)
if width != 1.0 and width > 0.0:
offset = width - 1.0
side_polygon = whiteBoxMesh.FacePolygonHandle(side_face)
whiteBoxMesh.TranslatePolygon(side_polygon, offset)
prev_edge = 0
# create rest of the staircase steps
for step in range(0, num_steps):
# extrude the back to create room for a new step
back_polygon = whiteBoxMesh.TranslatePolygonAppend(whiteBoxMesh.FacePolygonHandle(back_face), depth)
curr_faces += faces_added(step)
back_faces = back_polygon.FaceHandles
back_face = back_faces[-1]
# extrude upward to create the new step
top_back_polygon = whiteBoxMesh.FacePolygonHandle(top_back_face_handle(curr_faces))
whiteBoxMesh.TranslatePolygonAppend(top_back_polygon, height)
curr_faces += 8
# hide any edge created in the backside from extruding upward
prev_edge = edge_to_hide(prev_edge, step)
whiteBoxMesh.HideEdge(api.EdgeHandle(prev_edge))
def create_staircase(whiteBoxMesh, num_steps=2, depth=1.0, height=1.0, width=1.0):
# if calling create_staircase directly, we need to start with a unit cube
whiteBoxMesh.InitializeAsUnitCube()
create_staircase_from_white_box_mesh(whiteBoxMesh, num_steps, depth, height, width)
if __name__ == "__main__":
# cmdline arguments
parser = argparse.ArgumentParser(description='Creates a staircase shaped white box mesh.')
parser.add_argument('num_steps', nargs='?', default=4, type=int, help='number of steps in the staircase')
parser.add_argument('depth', nargs='?', default=1.0, type=float, help='depth of each step in the staircase')
parser.add_argument('height', nargs='?', default=1.0, type=float, help='height of each step in the staircase')
parser.add_argument('width', nargs='?', default=1.0, type=float, help='width of each step in the staircase')
args = parser.parse_args()
# initialize whiteBoxMesh
whiteBoxEntity = init.create_white_box_entity("WhiteBox-Staircase")
whiteBoxMeshComponent = init.create_white_box_component(whiteBoxEntity)
whiteBoxMesh = init.create_white_box_handle(whiteBoxMeshComponent)
create_staircase_from_white_box_mesh(whiteBoxMesh, args.num_steps, args.depth, args.height, args.width)
# update whiteBoxMesh
init.update_white_box(whiteBoxMesh, whiteBoxMeshComponent)