43 if (_recompute_task !=
nullptr) {
45 task_mgr->
remove(_recompute_task);
78 screen.
node()->
is_of_type(ProjectionScreen::get_class_type()), -1);
82 _screens.push_back(Screen());
83 Screen &new_screen = _screens.back();
84 new_screen._screen = screen;
85 new_screen._screen_node = screen_node;
86 new_screen._name = name;
87 new_screen._buffer =
nullptr;
88 new_screen._tex_width = 256;
89 new_screen._tex_height = 256;
90 new_screen._active =
true;
94 for (vi = 0; vi < _viewers.size(); ++vi) {
95 new_screen._meshes.push_back(Mesh());
104 nassertr(_dark_room.
is_same_graph(screen), _screens.size() - 1);
107 return _screens.size() - 1;
116 for (
size_t i = 0; i < _screens.size(); i++) {
117 if (_screens[i]._screen == screen) {
130 nassertv_always(index >= 0 && index < (
int)_screens.size());
131 Screen &screen = _screens[index];
132 for (
size_t vi = 0; vi < screen._meshes.size(); vi++) {
133 screen._meshes[vi]._mesh.remove_node();
135 _screens.erase(_screens.begin() + index);
143 while (!_screens.empty()) {
153 return _screens.size();
161 nassertr(index >= 0 && index < (
int)_screens.size(),
NodePath());
162 return _screens[index]._screen;
172 nassertr(index >= 0 && index < (
int)_screens.size(),
nullptr);
173 return _screens[index]._buffer;
186 nassertv(index >= 0 && index < (
int)_screens.size());
188 Screen &screen = _screens[index];
190 screen._tex_width = width;
191 screen._tex_height = height;
193 if (screen._buffer !=
nullptr) {
194 bool removed = _engine->remove_window(screen._buffer);
195 screen._buffer =
nullptr;
211 nassertv(index >= 0 && index < (
int)_screens.size());
212 nassertv(!source_camera.
is_empty() &&
214 _screens[index]._source_camera = source_camera;
223 nassertv(index >= 0 && index < (
int)_screens.size());
225 Screen &screen = _screens[index];
226 screen._active = active;
230 for (
size_t vi = 0; vi < screen._meshes.size(); vi++) {
231 screen._meshes[vi]._mesh.remove_node();
235 if (screen._buffer !=
nullptr) {
236 bool removed = _engine->remove_window(screen._buffer);
237 screen._buffer =
nullptr;
244 screen._screen.hide();
250 screen._screen.show();
259 nassertr(index >= 0 && index < (
int)_screens.size(),
false);
260 return _screens[index]._active;
281 nassertr(window !=
nullptr, -1);
284 nassertr(gsg !=
nullptr, -1);
287 nassertr(engine !=
nullptr, -1);
289 nassertr(_viewers.empty() || (engine == _engine), -1);
290 if (_engine ==
nullptr) {
294 if (_recompute_task ==
nullptr) {
298 task_mgr->
add(_recompute_task);
302 if (previous_vi >= 0) {
306 size_t vi = _viewers.size();
307 _viewers.push_back(Viewer());
308 Viewer &viewer = _viewers[vi];
314 if (viewer._viewer.is_empty()) {
315 viewer._viewer_node =
nullptr;
317 viewer._viewer_node = DCAST(
LensNode, viewer._viewer.node());
322 viewer._internal_camera =
new Camera(
"internal_camera");
323 viewer._internal_camera->set_lens(
new MatrixLens);
324 viewer._internal_scene =
NodePath(
"internal_screens");
325 viewer._internal_camera->set_scene(viewer._internal_scene);
328 viewer._dr->set_camera(camera_np);
336 Screens::iterator si;
337 for (si = _screens.begin(); si != _screens.end(); ++si) {
338 Screen &screen = (*si);
339 screen._meshes.push_back(Mesh());
340 nassertr(screen._meshes.size() == _viewers.size(), -1);
346 _dark_room = viewer._viewer.
get_top();
360 for (
size_t vi = 0; vi < _viewers.size(); vi++) {
361 if (_viewers[vi]._dr == dr) {
374 nassertv_always(index >= 0 && index < (
int)_viewers.size());
375 Viewer &viewer = _viewers[index];
376 viewer._internal_camera->set_scene(
NodePath());
377 viewer._dr->set_camera(viewer._viewer);
380 Screens::iterator si;
381 for (si = _screens.begin(); si != _screens.end(); ++si) {
382 Screen &screen = (*si);
383 nassertv(index < (
int)screen._meshes.size());
384 screen._meshes[index]._mesh.remove_node();
385 screen._meshes.erase(screen._meshes.begin() + index);
388 _viewers.erase(_viewers.begin() + index);
396 while (!_viewers.empty()) {
415 nassertv(index >= 0 && index < (
int)_viewers.size());
416 nassertv(!viewer_camera.
is_empty() &&
418 Viewer &viewer = _viewers[index];
419 viewer._viewer = viewer_camera;
420 viewer._viewer_node = DCAST(
LensNode, viewer_camera.
node());
424 _dark_room = viewer._viewer.
get_top();
436 nassertr(index >= 0 && index < (
int)_viewers.size(),
NodePath());
437 return _viewers[index]._viewer;
451 nassertr(index >= 0 && index < (
int)_viewers.size(),
NodePath());
452 return _viewers[index]._internal_scene;
460 return _viewers.size();
468 nassertr(index >= 0 && index < (
int)_viewers.size(),
nullptr);
469 return _viewers[index]._dr;
503 for (vi = 0; vi < _viewers.size(); ++vi) {
504 Viewer &viewer = _viewers[vi];
506 Screens::iterator si;
507 for (si = _screens.begin(); si != _screens.end(); ++si) {
508 Screen &screen = (*si);
509 if (screen._active) {
510 recompute_screen(screen, vi);
514 if (viewer._viewer_node !=
nullptr &&
515 viewer._viewer_node->get_lens() !=
nullptr) {
516 viewer._viewer_lens_change =
517 viewer._viewer_node->get_lens()->get_last_change();
530 self->recompute_if_stale();
531 return AsyncTask::DS_cont;
543 for (vi = 0; vi < _viewers.size(); ++vi) {
544 Viewer &viewer = _viewers[vi];
545 if (viewer._viewer_node !=
nullptr) {
547 viewer._viewer_node->get_lens()->get_last_change();
548 if (lens_change != viewer._viewer_lens_change) {
551 Screens::iterator si;
552 for (si = _screens.begin(); si != _screens.end(); ++si) {
553 Screen &screen = (*si);
554 if (screen._active) {
555 recompute_screen(screen, vi);
561 Screens::iterator si;
562 for (si = _screens.begin(); si != _screens.end(); ++si) {
563 Screen &screen = (*si);
564 if (screen._active &&
565 screen._meshes[vi]._last_screen != screen._screen_node->get_last_screen()) {
566 recompute_screen(screen, vi);
568 screen._screen_node->recompute_if_stale(screen._screen);
580 void NonlinearImager::
581 recompute_screen(NonlinearImager::Screen &screen,
size_t vi) {
582 nassertv(vi < screen._meshes.size());
583 screen._meshes[vi]._mesh.remove_node();
584 if (!screen._active) {
588 screen._screen_node->recompute_if_stale(screen._screen);
590 Viewer &viewer = _viewers[vi];
592 screen._screen_node->make_flat_mesh(screen._screen, viewer._viewer);
593 if (mesh !=
nullptr) {
594 screen._meshes[vi]._mesh = viewer._internal_scene.attach_new_node(mesh);
597 if (screen._buffer ==
nullptr) {
600 (screen._name, screen._tex_width, screen._tex_height,
nullptr,
false);
602 if (buffer !=
nullptr) {
603 screen._buffer = buffer;
608 screen._meshes[vi]._mesh.clear_texture();
612 if (screen._buffer !=
nullptr) {
613 screen._meshes[vi]._mesh.set_texture(screen._buffer->get_texture());
619 screen._screen.set_texture(screen._buffer->get_texture());
622 screen._meshes[vi]._last_screen = screen._screen_node->get_last_screen();