-from panda3d.core import CullFaceAttrib, Point3, NodePath, Point2, Texture
+from panda3d.core import CullFaceAttrib, Point3, NodePath, Point2, Texture, \
+ Plane, Vec3
from panda3d.bullet import BulletBoxShape, BulletRigidBodyNode, BulletGhostNode
from direct.gui.OnscreenText import OnscreenText
from lib.lib.p3d.gfx import P3dGfxMgr
+
class Box:
def __init__(self, world, plane_node, count, cb_inst):
bounds = self._np.get_tight_bounds()
bounds = bounds[0] - self._np.get_pos(), bounds[1] - self._np.get_pos()
self._np.set_pos(pos)
- dist = -1, -1
- def __update(set, get, delta):
- set(get() + delta)
- top_left = self._np.get_pos() + (bounds[0][0], bounds[0][1], bounds[1][2])
- tl2d = P3dGfxMgr.screen_coord(top_left)
- tmpnode = NodePath('tmp')
- tmpnode.set_pos(tl2d[0], 0, tl2d[1])
- cornernode = NodePath('corner')
- cornernode.set_pos(corner[0], 0, corner[1])
- dist = tmpnode.get_pos(cornernode)
- tmpnode.remove_node()
- cornernode.remove_node()
- return dist
- while dist[0] < .01:
- dist = __update(self._np.set_x, self._np.get_x, .01)
- while dist[2] > -.01:
- dist = __update(self._np.set_z, self._np.get_z, -.01)
+ plane = Plane(Vec3(0, 1, 0), bounds[0][1])
+ pos3d, near_pt, far_pt = Point3(), Point3(), Point3()
+ margin, ar = .04, base.get_aspect_ratio()
+ margin_x = margin / ar if ar >= 1 else margin
+ margin_z = margin * ar if ar < 1 else margin
+ base.camLens.extrude((-1 + margin_x, 1 - margin_z), near_pt, far_pt)
+ plane.intersects_line(
+ pos3d, render.get_relative_point(base.camera, near_pt),
+ render.get_relative_point(base.camera, far_pt))
+ delta = Vec3(bounds[1][0], bounds[1][1], bounds[0][2])
+ self._np.set_pos(pos3d + delta)
if not hasattr(self, '_txt'):
font = base.loader.load_font('assets/fonts/Hanken-Book.ttf')
font.clear()
from textwrap import dedent
from panda3d.core import GeomVertexData, GeomVertexFormat, Geom, \
- GeomVertexWriter, GeomTriangles, GeomNode, Shader, Point3
+ GeomVertexWriter, GeomTriangles, GeomNode, Shader, Point3, Plane, Vec3
from lib.lib.p3d.gfx import P3dGfxMgr
bounds = self._np.get_tight_bounds()
corner3d = bounds[1][0], bounds[1][1], bounds[0][2]
corner2d = P3dGfxMgr.screen_coord(corner3d)
- def __update(dscale):
- scale = self._np.get_scale()
- self._np.set_scale(scale + dscale)
- bounds = self._np.get_tight_bounds()
- corner3d = bounds[1][0], bounds[1][1], bounds[0][2]
- return P3dGfxMgr.screen_coord(corner3d)
- while corner2d[0] < corner[0] + .01:
- corner2d = __update((.01, 0, 0))
- while corner2d[1] > corner[1] - .01:
- corner2d = __update((0, 0, .01))
+ plane = Plane(Vec3(0, 1, 0), y)
+ pos3d, near_pt, far_pt = Point3(), Point3(), Point3()
+ ar, margin = base.get_aspect_ratio(), .04
+ x = corner[0] / ar if ar >= 1 else corner[0]
+ z = corner[1] * ar if ar < 1 else corner[1]
+ x += margin / ar if ar >= 1 else margin
+ z -= margin * ar if ar < 1 else margin
+ base.camLens.extrude((x, z), near_pt, far_pt)
+ plane.intersects_line(
+ pos3d, render.get_relative_point(base.camera, near_pt),
+ render.get_relative_point(base.camera, far_pt))
+ corner_pos3d, near_pt, far_pt = Point3(), Point3(), Point3()
+ base.camLens.extrude((-1, 1), near_pt, far_pt)
+ plane.intersects_line(
+ corner_pos3d, render.get_relative_point(base.camera, near_pt),
+ render.get_relative_point(base.camera, far_pt))
+ self._np.set_pos((pos3d + corner_pos3d) / 2)
+ scale = Vec3(pos3d[0] - corner_pos3d[0], 1, corner_pos3d[2] - pos3d[2])
+ self._np.set_scale(scale)
def _set(self, pos, y):
if hasattr(self, '_np'):