print ( " How to use: paste into a Blender Text Editor panel, select object, Run Script " )
y_up = True
enable_minetest = True
import bpy
#from mathutils import Matrix
from mathutils import Vector
#from mathutils import Euler
ob1 = None
try :
ob1 = obj . select_get ( )
except :
# < 2.8
ob1 = bpy . context . scene . objects . active
class MessageBox ( bpy . types . Operator ) :
bl_idname = " message.messagebox "
bl_label = " "
message = bpy . props . StringProperty (
name = " message " ,
description = " message " ,
default = ' '
)
def execute ( self , context ) :
self . report ( { ' INFO ' } , self . message )
print ( self . message )
return { ' FINISHED ' }
def invoke ( self , context , event ) :
return context . window_manager . invoke_props_dialog ( self , width = 400 )
def draw ( self , context ) :
self . layout . label ( self . message )
self . layout . label ( " " )
#col = self.layout.column(align = True)
#col.prop(context.scene, "my_string_prop")
bpy . utils . register_class ( MessageBox )
#print(str(thisO))
#extents1 = ob1.dimensions.copy()
#if (extents1.x == 0.0) and (extents1.y == 0.0) and (extents1.z == 0.0) and (ob1.scale.x > 0.0):
#extents1.x = extents1.x / 10.0
#extents1.y = extents1.y / 10.0
#extents1.z = extents1.z / 10.0
loc1 = ob1 . location
#loc1 = ob1.matrix_world.translation
#print(str(extents1))
#see https://blender.stackexchange.com/questions/8459/get-blender-x-y-z-and-bounding-box-with-script
#bbox_corners = [ob1.matrix_world * Vector(corner) for corner in ob1.bound_box]
#use ground as bottom
#if zMin < 0.0:
# yMax -= yMin
# yMin = 0.0
#print(
# " collisionbox = {{{:.2f}, {:.2f}, {:.2f}, {:.2f}, {:.2f}, {:.2f}}}".format(xMin, yMin, zMin, xMax, yMax, zMax)
#)
#see https://blender.stackexchange.com/questions/6139/how-to-iterate-through-all-vertices-of-an-object-that-contains-multiple-meshes
mesh = ob1 . data
#print("mesh:" + str(mesh))
#print("hasattr(mesh, 'vertices'):" + str(hasattr(mesh, 'vertices')))]
xMin = None
if ( mesh is not None ) and ( not hasattr ( mesh , ' vertices ' ) ) :
print ( " --can ' t calculate collisionbox for skeleton " )
elif mesh is not None :
xMin = None
yMin = None
zMin = None
xMax = None
yMax = None
zMax = None
for vert in mesh . vertices :
# switch y and z for Minetest (y-up)
if ( xMin is None ) or ( vert . co . x < xMin ) :
xMin = vert . co . x
if ( xMax is None ) or ( vert . co . x > xMax ) :
xMax = vert . co . x
if ( yMin is None ) or ( vert . co . y < yMin ) :
yMin = vert . co . y
if ( yMax is None ) or ( vert . co . y > yMax ) :
yMax = vert . co . y
if ( zMin is None ) or ( vert . co . z < zMin ) :
zMin = vert . co . z
if ( zMax is None ) or ( vert . co . z > zMax ) :
zMax = vert . co . z
#print(str(extents1))
#print("--by vertices (raw):")
#print(
# " collisionbox = {{{:.2f}, {:.2f}, {:.2f}, {:.2f}, {:.2f}, {:.2f}}}".format(xMin, yMin, zMin, xMax, yMax, zMax)
#)
xMax + = ob1 . location . x
xMin + = ob1 . location . x
yMax + = ob1 . location . y
yMin + = ob1 . location . y
zMax + = ob1 . location . z
zMin + = ob1 . location . z
print ( " --by vertices: " )
else :
extents1 = ob1 . scale . copy ( )
# Object is an empty, so scale up for Minetest
extents1 . x = extents1 . x * 2.0
extents1 . y = extents1 . y * 2.0
extents1 . z = extents1 . z * 2.0
xMin = loc1 . x - extents1 . x / 2.0
xMax = loc1 . x + extents1 . x / 2.0
yMin = loc1 . y - extents1 . y / 2.0
yMax = loc1 . y + extents1 . y / 2.0
zMin = loc1 . z - extents1 . z / 2.0
zMax = loc1 . z + extents1 . z / 2.0
print ( " --using empty object: " )
#switch y and z for Minetest (y-up):
if enable_minetest :
xMin / = 10.0
xMax / = 10.0
yMin / = 10.0
yMax / = 10.0
zMin / = 10.0
zMax / = 10.0
msg = ' Size is not available. Make sure you have a mesh object selected. '
if xMin is not None :
if y_up :
tmp = yMin
yMin = zMin
zMin = tmp
tmp = yMax
yMax = zMax
zMax = tmp
msg = " collisionbox = {{ {:.2f} , {:.2f} , {:.2f} , {:.2f} , {:.2f} , {:.2f} }} " . format ( xMin , yMin , zMin , xMax , yMax , zMax )
# print(msg)
bpy . ops . message . messagebox ( ' INVOKE_DEFAULT ' , message = msg )
bpy . utils . unregister_class ( MessageBox )