Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
self.ui_camera = NodePath(PandaCamera('ui_camera'))
self.ui_lens = OrthographicLens()
# moved set_film_size() to window module for correct aspect ratio after setting window size
self.ui_lens.set_near_far(-1000, 1000)
self.ui_camera.node().set_lens(self.ui_lens)
self._ui_lens_node = LensNode('_ui_lens_node', self.ui_lens)
self.ui_render = NodePath('ui_render')
self.ui_render.set_depth_test(0)
self.ui_render.set_depth_write(0)
self.ui_camera.reparent_to(self.ui_render)
self.ui_display_region.set_camera(self.ui_camera)
scene.ui_camera = self.ui_camera
self.ui = Entity(eternal=True, name='ui', parent=self.ui_camera, scale=(self.ui_size*.5, self.ui_size*.5))
self.overlay = Entity(parent=self.ui, model='quad', scale_x=self.aspect_ratio, color=color.clear, eternal=True, z=-99)
# these get created when setting a shader
self.filter_manager = None
self.filter_quad = None
self.render_texture = None
self.filter_quad = None
self.depth_texture = None
def import_all_classes(path=application.asset_folder, debug=False):
path = str(path)
sys.path.append(path)
from ursina.string_utilities import snake_to_camel
from glob import iglob
imported_successfully = list()
for file_path in iglob(path + '**/*.py', recursive=True):
if '\\build\\' in file_path or '__' in file_path:
continue
rel_path = file_path[len(path):][:-3].replace('\\', '.')
if rel_path.startswith('.'):
rel_path = rel_path[1:]
module_name = os.path.basename(file_path).split('.')[0]
class_name = snake_to_camel(module_name)
module_name = module_name
imported_meshes[name] = m
return m
elif filetype == '.blend':
print('found blend file:', filename)
if compress_models(path=path, name=name):
# obj_to_ursinamesh(name=name)
return load_model(name, path)
# else:
return None
# find blender installations
if not hasattr(application, 'blender_paths') and application.development_mode:
application.blender_paths = dict()
if platform.system() == 'Windows':
# get blender path by getting default program for '.blend' file extention
import shlex
import winreg
try:
class_root = winreg.QueryValue(winreg.HKEY_CLASSES_ROOT, '.blend')
with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r'{}\shell\open\command'.format(class_root)) as key:
command = winreg.QueryValueEx(key, '')[0]
default_blender = shlex.split(command)[0]
default_blender = Path(default_blender)
application.blender_paths['default'] = default_blender
blender_foundation_directory = default_blender.parent.parent
self.double_sided = False
# self.always_on_top = False
self.collision = False # toggle collision without changing collider.
self.collider = None # set to 'box'/'sphere'/'mesh' for auto fitted collider.
self.scripts = list() # add with add_script(class_instance). will assign an 'entity' variable to the script.
self.animations = list()
self.hovered = False # will return True if mouse hovers entity.
self.origin = Vec3(0,0,0)
self.position = Vec3(0,0,0) # right, up, forward. can also set self.x, self.y, self.z
self.rotation = Vec3(0,0,0) # can also set self.rotation_x, self.rotation_y, self.rotation_z
self.scale = Vec3(1,1,1) # can also set self.scale_x, self.scale_y, self.scale_z
self.line_definition = None # returns a Traceback(filename, lineno, function, code_context, index).
if application.trace_entity_definition and add_to_scene_entities:
from inspect import getframeinfo, stack
_stack = stack()
caller = getframeinfo(_stack[1][0])
if len(_stack) > 2 and _stack[1].code_context and 'super().__init__()' in _stack[1].code_context[0]:
caller = getframeinfo(_stack[2][0])
self.line_definition = caller
if caller.code_context:
self.code_context = caller.code_context[0]
if (self.code_context.count('(') == self.code_context.count(')') and
' = ' in self.code_context and not 'name=' in self.code_context
and not 'Ursina()' in self.code_context):
self.name = self.code_context.split(' = ')[0].strip().replace('self.', '')
# print('set name to:', self.code_context.split(' = ')[0].strip().replace('self.', ''))
if not self.raycast or self._pq.get_num_entries() == 0:
self.unhover_everything_not_hit()
return False
self._pq.sortEntries()
for entry in self._pq.getEntries():
for entity in scene.entities:
if entry.getIntoNodePath().parent == entity and entity.collision:
if entity.collision:
hit = HitInfo(
hit = entry.collided(),
entity = entity,
distance = distance(entry.getSurfacePoint(scene), camera.getPos()),
point = entry.getSurfacePoint(entity),
world_point = entry.getSurfacePoint(scene),
normal = entry.getSurfaceNormal(entity),
world_normal = entry.getSurfaceNormal(scene),
)
self.collisions.append(hit)
break
if self.collisions:
self.collision = self.collisions[0]
self.hovered_entity = self.collision.entity
if not self.hovered_entity.hovered:
self.hovered_entity.hovered = True
if hasattr(self.hovered_entity, 'on_mouse_enter'):
self.hovered_entity.on_mouse_enter()
for s in self.hovered_entity.scripts:
if hasattr(s, 'on_mouse_enter'):
s.on_mouse_enter()
tag = tag[4:-1]
hsb_values = tuple(float(e.strip()) for e in tag.split(','))
self.current_color = color.color(*hsb_values)
elif tag.startswith('rgb('): # set color based on numbers
tag = tag[4:-1]
rgb_values = (float(e.strip()) for e in tag.split(','))
self.current_color = color.rgba(*rgb_values)
if tag.startswith('scale:'):
scale = tag.split(':')[1]
self.scale_override = float(scale)
elif tag.startswith('image:'):
texture_name = tag.split(':')[1]
image = Entity(
parent=self.text_node_path,
name='inline_image',
model='quad',
texture=texture_name,
color=self.current_color,
scale=1,
# position=(x*self.size*self.scale_override, y*self.size*self.line_height),
origin=(.0, -.25),
add_to_scene_entities=False,
)
if not image.texture:
destroy(image)
else:
self.images.append(image)
# self.text_node.remove_node()
# self.text_node = image
def destroy(entity, delay=0):
if delay == 0:
_destroy(entity)
return
s = Sequence(
Wait(delay),
Func(_destroy, entity)
)
s.start()
def invoke(function, *args, **kwargs):
delay = 0
if 'delay' in kwargs:
delay = kwargs['delay']
del kwargs['delay']
if not delay:
function(*args, **kwargs)
return function
s = Sequence(
Wait(delay),
Func(function, *args, **kwargs)
)
s.start()
return s
def shake(self, duration=.2, magnitude=1, speed=.05, direction=(1,1)):
import random
s = Sequence()
original_position = self.position
for i in range(int(duration / speed)):
s.append(Func(self.set_position,
Vec3(
original_position[0] + (random.uniform(-.1, .1) * magnitude * direction[0]),
original_position[1] + (random.uniform(-.1, .1) * magnitude * direction[1]),
original_position[2],
)))
s.append(Wait(speed))
s.append(Func(self.set_position, original_position))
s.start()
return s
setattr(self, animator_name, Sequence(time_step=time_step))
sequence = getattr(self, animator_name)
self.animations.append(sequence)
# sequence.append(Wait(delay))
if not resolution:
resolution = max(int(duration * 60), 1)
for i in range(resolution+1):
t = i / resolution
# if isinstance(curve, CubicBezier):
# t = curve.calculate(t)
# else:
t = curve(t)
sequence.append(Wait(duration / resolution))
sequence.append(Func(setattr, self, name, lerp(getattr(self, name), value, t)))
sequence.start()
return sequence