From 6ce891f748e307fd98ea8e9c0db1230448afe466 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 7 Jan 2015 22:34:43 +0100 Subject: [PATCH] Finally fix the aspect ratio on the blasted FPS meter --- panda/src/grutil/frameRateMeter.cxx | 53 ++++++++++++++++++++--------- panda/src/grutil/frameRateMeter.h | 3 ++ 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/panda/src/grutil/frameRateMeter.cxx b/panda/src/grutil/frameRateMeter.cxx index 7e4f779a8b..d1a6565009 100644 --- a/panda/src/grutil/frameRateMeter.cxx +++ b/panda/src/grutil/frameRateMeter.cxx @@ -30,10 +30,13 @@ TypeHandle FrameRateMeter::_type_handle; //////////////////////////////////////////////////////////////////// // Function: FrameRateMeter::Constructor // Access: Published -// Description: +// Description: //////////////////////////////////////////////////////////////////// FrameRateMeter:: -FrameRateMeter(const string &name) : TextNode(name) { +FrameRateMeter(const string &name) : + TextNode(name), + _last_aspect_ratio(-1) { + set_cull_callback(); Thread *current_thread = Thread::get_current_thread(); @@ -53,13 +56,13 @@ FrameRateMeter(const string &name) : TextNode(name) { // the calculation within TextAssembler. PN_stdfloat height = 1.0f; TextFont *font = get_font(); - if (font != NULL){ + if (font != NULL){ height = font->get_line_height() * 0.8; } set_align(A_right); - set_transform(LMatrix4::scale_mat(frame_rate_meter_scale) * - LMatrix4::translate_mat(LVector3::rfu(1.0f - frame_rate_meter_side_margins * frame_rate_meter_scale, 0.0f, 1.0f - frame_rate_meter_scale * height))); + set_transform(LMatrix4::scale_mat(frame_rate_meter_scale) * + LMatrix4::translate_mat(LVector3::rfu(-frame_rate_meter_side_margins * frame_rate_meter_scale, 0.0f, -frame_rate_meter_scale * height))); set_card_color(0.0f, 0.0f, 0.0f, 0.4); set_card_as_margin(frame_rate_meter_side_margins, frame_rate_meter_side_margins, 0.1f, 0.0f); // set_usage_hint(Geom::UH_client); @@ -70,7 +73,7 @@ FrameRateMeter(const string &name) : TextNode(name) { //////////////////////////////////////////////////////////////////// // Function: FrameRateMeter::Destructor // Access: Published, Virtual -// Description: +// Description: //////////////////////////////////////////////////////////////////// FrameRateMeter:: ~FrameRateMeter() { @@ -99,25 +102,26 @@ setup_window(GraphicsOutput *window) { _root.node()->set_attrib(dw, 1); _root.set_material_off(1); _root.set_two_sided(1, 1); - + // Create a display region that covers the entire window. _display_region = _window->make_mono_display_region(); _display_region->set_sort(frame_rate_meter_layer_sort); - + // Finally, we need a camera to associate with the display region. PT(Camera) camera = new Camera("frame_rate_camera"); NodePath camera_np = _root.attach_new_node(camera); - + PT(Lens) lens = new OrthographicLens; - - static const PN_stdfloat left = -1.0f; - static const PN_stdfloat right = 1.0f; - static const PN_stdfloat bottom = -1.0f; - static const PN_stdfloat top = 1.0f; + + // We choose these values such that we can place the text against (0, 0). + static const PN_stdfloat left = -2.0f; + static const PN_stdfloat right = 0.0f; + static const PN_stdfloat bottom = -2.0f; + static const PN_stdfloat top = 0.0f; lens->set_film_size(right - left, top - bottom); lens->set_film_offset((right + left) * 0.5, (top + bottom) * 0.5); lens->set_near_far(-1000, 1000); - + camera->set_lens(lens); camera->set_scene(_root); _display_region->set_camera(camera_np); @@ -170,7 +174,24 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { // Statistics PStatTimer timer(_show_fps_pcollector, current_thread); - + + // This is probably a good time to check if the aspect ratio on + // the window has changed. + int width = _display_region->get_pixel_width(); + int height = _display_region->get_pixel_height(); + PN_stdfloat aspect_ratio = 1; + if (width != 0 && height != 0) { + aspect_ratio = (PN_stdfloat)height / (PN_stdfloat)width; + } + + // Scale the transform by the calculated aspect ratio. + if (aspect_ratio != _last_aspect_ratio) { + _aspect_ratio_transform = TransformState::make_scale(LVecBase3(aspect_ratio, 1, 1)); + _last_aspect_ratio = aspect_ratio; + cerr << aspect_ratio << "\n"; + } + data._net_transform = data._net_transform->compose(_aspect_ratio_transform); + // Check to see if it's time to update. double now = _clock_object->get_frame_time(current_thread); double elapsed = now - _last_update; diff --git a/panda/src/grutil/frameRateMeter.h b/panda/src/grutil/frameRateMeter.h index 2f95bbaf72..e688b6da86 100644 --- a/panda/src/grutil/frameRateMeter.h +++ b/panda/src/grutil/frameRateMeter.h @@ -77,6 +77,9 @@ private: string _text_pattern; ClockObject *_clock_object; + PN_stdfloat _last_aspect_ratio; + CPT(TransformState) _aspect_ratio_transform; + static PStatCollector _show_fps_pcollector; public: