34 FrameRateMeter(
const std::string &name) :
36 _last_aspect_ratio(-1) {
46 _show_milliseconds = frame_rate_meter_milliseconds;
47 if (_show_milliseconds) {
48 _text_pattern = frame_rate_meter_ms_text_pattern;
50 _text_pattern = frame_rate_meter_text_pattern;
53 _update_interval = frame_rate_meter_update_interval;
59 PN_stdfloat height = 1.0f;
66 set_transform(LMatrix4::scale_mat(frame_rate_meter_scale) *
67 LMatrix4::translate_mat(LVector3::rfu(-frame_rate_meter_side_margins * frame_rate_meter_scale, 0.0f, -frame_rate_meter_scale * height)));
68 set_card_color(0.0f, 0.0f, 0.0f, 0.4);
69 set_card_as_margin(frame_rate_meter_side_margins, frame_rate_meter_side_margins, 0.1f, 0.0f);
72 do_update(current_thread);
96 CPT(
RenderAttrib) dt = DepthTestAttrib::make(DepthTestAttrib::M_none);
97 CPT(
RenderAttrib) dw = DepthWriteAttrib::make(DepthWriteAttrib::M_off);
109 _display_region = _window->make_mono_display_region();
110 _display_region->set_sort(frame_rate_meter_layer_sort);
119 static const PN_stdfloat left = -2.0f;
120 static const PN_stdfloat right = 0.0f;
121 static const PN_stdfloat bottom = -2.0f;
122 static const PN_stdfloat top = 0.0f;
124 lens->set_film_offset((right + left) * 0.5, (top + bottom) * 0.5);
125 lens->set_near_far(-1000, 1000);
127 camera->set_lens(lens);
128 camera->set_scene(_root);
129 _display_region->set_camera(camera_np);
137 if (_window !=
nullptr) {
138 _window->remove_display_region(_display_region);
140 _display_region =
nullptr;
163 bool FrameRateMeter::
167 nassertr(_display_region !=
nullptr,
false);
172 PStatTimer timer(_show_fps_pcollector, current_thread);
176 int width = _display_region->get_pixel_width();
177 int height = _display_region->get_pixel_height();
178 PN_stdfloat aspect_ratio = 1;
179 if (width != 0 && height != 0) {
180 aspect_ratio = (PN_stdfloat)height / (PN_stdfloat)width;
184 if (aspect_ratio != _last_aspect_ratio) {
185 _aspect_ratio_transform = TransformState::make_scale(LVecBase3(aspect_ratio, 1, 1));
186 _last_aspect_ratio = aspect_ratio;
188 data._net_transform = data._net_transform->compose(_aspect_ratio_transform);
192 double elapsed = now - _last_update;
193 if (elapsed < 0.0 || elapsed >= _update_interval) {
194 do_update(current_thread);
197 return TextNode::cull_callback(trav, data);
203 void FrameRateMeter::
204 do_update(
Thread *current_thread) {
210 if (_show_milliseconds) {
211 value = 1000.0 / value;
212 deviation = 1000.0 / deviation;
215 static const size_t buffer_size = 1024;
216 char buffer[buffer_size];
217 #if defined(WIN32_VC) || defined(WIN64_VC)
219 sprintf(buffer, _text_pattern.c_str(), value, deviation);
221 snprintf(buffer, buffer_size, _text_pattern.c_str(), value, deviation);
223 nassertv(strlen(buffer) < buffer_size);