Add patch from community member teedee to improve alternate coordinate-system support

This commit is contained in:
David Rose 2011-11-17 19:41:33 +00:00
parent be7f483478
commit 807a6f61da
4 changed files with 62 additions and 22 deletions

View File

@ -325,8 +325,25 @@ class DirectEntry(DirectFrame):
self.ll.set(left, 0.0, bottom) self.ll.set(left, 0.0, bottom)
self.ur.set(right, 0.0, top) self.ur.set(right, 0.0, top)
self.ll = mat.xformPoint(self.ll) self.ll = mat.xformPoint(Point3.rfu(left, 0.0, bottom))
self.ur = mat.xformPoint(self.ur) self.ur = mat.xformPoint(Point3.rfu(right, 0.0, top))
vec_right = Vec3.right()
vec_up = Vec3.up()
left = (vec_right[0] * self.ll[0]
+ vec_right[1] * self.ll[1]
+ vec_right[2] * self.ll[2])
right = (vec_right[0] * self.ur[0]
+ vec_right[1] * self.ur[1]
+ vec_right[2] * self.ur[2])
bottom = (vec_up[0] * self.ll[0]
+ vec_up[1] * self.ll[1]
+ vec_up[2] * self.ll[2])
top = (vec_up[0] * self.ur[0]
+ vec_up[1] * self.ur[1]
+ vec_up[2] * self.ur[2])
self.ll = Point3(left, 0.0, bottom)
self.ur = Point3(right, 0.0, top)
# Scale bounds to give a pad around graphics. We also want to # Scale bounds to give a pad around graphics. We also want to
# scale around the border width. # scale around the border width.

View File

@ -323,9 +323,9 @@ class OnscreenText(DirectObject, NodePath):
def updateTransformMat(self): def updateTransformMat(self):
assert(isinstance(self.textNode, TextNode)) assert(isinstance(self.textNode, TextNode))
mat = ( mat = (
Mat4.scaleMat(self.scale[0], 1, self.scale[1]) * Mat4.scaleMat(Vec3.rfu(self.scale[0], 1, self.scale[1])) *
Mat4.rotateMat(self.roll, Vec3(0, -1, 0)) * Mat4.rotateMat(self.roll, Vec3.back()) *
Mat4.translateMat(self.pos[0], 0, self.pos[1]) Mat4.translateMat(Point3.rfu(self.pos[0], 0, self.pos[1]))
) )
self.textNode.setTransform(mat) self.textNode.setTransform(mat)

View File

@ -408,8 +408,8 @@ class BufferViewer(DirectObject):
posx = dirx * (1.0 - ((c + 0.5) * (fsizex + fpixelx * bordersize))) - (fpixelx * dirx) posx = dirx * (1.0 - ((c + 0.5) * (fsizex + fpixelx * bordersize))) - (fpixelx * dirx)
posy = diry * (1.0 - ((r + 0.5) * (fsizey + fpixely * bordersize))) - (fpixely * diry) posy = diry * (1.0 - ((r + 0.5) * (fsizey + fpixely * bordersize))) - (fpixely * diry)
placer = NodePath("card-structure") placer = NodePath("card-structure")
placer.setPos(posx, 0, posy) placer.setPos(Point3.rfu(posx, 0, posy))
placer.setScale(fsizex*0.5, 1.0, fsizey*0.5) placer.setScale(Vec3.rfu(fsizex*0.5, 1.0, fsizey*0.5))
placer.setBin(self.cullbin, self.cullsort) placer.setBin(self.cullbin, self.cullsort)
placer.reparentTo(self.renderParent) placer.reparentTo(self.renderParent)
frame.instanceTo(placer) frame.instanceTo(placer)

View File

@ -59,6 +59,10 @@ PGEntry(const string &name) :
_blink_rate = 1.0f; _blink_rate = 1.0f;
_text_render_root = NodePath("text_root"); _text_render_root = NodePath("text_root");
CPT(TransformState) transform = TransformState::make_mat(LMatrix4::convert_mat(CS_default, CS_zup_right));
_text_render_root.set_transform(transform);
_cursor_scale = _text_render_root.attach_new_node("cursor_scale"); _cursor_scale = _text_render_root.attach_new_node("cursor_scale");
_cursor_def = _cursor_scale.attach_new_node("cursor"); _cursor_def = _cursor_scale.attach_new_node("cursor");
_cursor_visible = true; _cursor_visible = true;
@ -569,26 +573,45 @@ setup(PN_stdfloat width, int num_lines) {
PN_stdfloat line_height = text_node->get_line_height(); PN_stdfloat line_height = text_node->get_line_height();
// Determine the four corners of the frame. // Determine the four corners of the frame.
LPoint3 ll(0.0f, 0.0f, -0.3 * line_height - (line_height * (num_lines - 1))); float bottom = -0.3f * line_height - (line_height * (num_lines - 1));
LPoint3 ur(width, 0.0f, line_height);
LPoint3 lr(ur[0], 0.0f, ll[2]);
LPoint3 ul(ll[0], 0.0f, ur[2]);
// Transform each corner by the TextNode's transform. // Transform each corner by the TextNode's transform.
LMatrix4 mat = text_node->get_transform(); LMatrix4 mat = text_node->get_transform();
ll = ll * mat; LPoint3 ll = LPoint3::rfu(0.0f, 0.0f, bottom) * mat;
ur = ur * mat; LPoint3 ur = LPoint3::rfu(width, 0.0f, line_height) * mat;
lr = lr * mat; LPoint3 lr = LPoint3::rfu(width, 0.0f, bottom) * mat;
ul = ul * mat; LPoint3 ul = LPoint3::rfu(0.0f, 0.0f, line_height) * mat;
LVector3 up = LVector3::up();
int up_axis;
if (up[1]) {
up_axis = 1;
}
else if (up[2]) {
up_axis = 2;
}
else {
up_axis = 0;
}
LVector3 right = LVector3::right();
int right_axis;
if (right[0]) {
right_axis = 0;
}
else if (right[2]) {
right_axis = 2;
}
else {
right_axis = 1;
}
// And get the new minmax to define the frame. We do all this work // And get the new minmax to define the frame. We do all this work
// instead of just using the lower-left and upper-right corners, // instead of just using the lower-left and upper-right corners,
// just in case the text was rotated. // just in case the text was rotated.
LVecBase4 frame; LVecBase4 frame;
frame[0] = min(min(ll[0], ur[0]), min(lr[0], ul[0])); frame[0] = min(min(ll[right_axis], ur[right_axis]), min(lr[right_axis], ul[right_axis]));
frame[1] = max(max(ll[0], ur[0]), max(lr[0], ul[0])); frame[1] = max(max(ll[right_axis], ur[right_axis]), max(lr[right_axis], ul[right_axis]));
frame[2] = min(min(ll[2], ur[2]), min(lr[2], ul[2])); frame[2] = min(min(ll[up_axis], ur[up_axis]), min(lr[up_axis], ul[up_axis]));
frame[3] = max(max(ll[2], ur[2]), max(lr[2], ul[2])); frame[3] = max(max(ll[up_axis], ur[up_axis]), max(lr[up_axis], ul[up_axis]));
switch (text_node->get_align()) { switch (text_node->get_align()) {
case TextNode::A_left: case TextNode::A_left:
@ -875,8 +898,8 @@ update_text() {
_current_text.set_x(_current_text.get_x() - _current_padding); _current_text.set_x(_current_text.get_x() - _current_padding);
_current_text.set_scissor(NodePath(this), _current_text.set_scissor(NodePath(this),
LPoint3(0, 0, -0.5), LPoint3(_max_width, 0, -0.5), LPoint3::rfu(0, 0, -0.5), LPoint3::rfu(_max_width, 0, -0.5),
LPoint3(_max_width, 0, 1.5), LPoint3(0, 0, 1.5)); LPoint3::rfu(_max_width, 0, 1.5), LPoint3::rfu(0, 0, 1.5));
} }
_text_geom_stale = false; _text_geom_stale = false;