open_toontown_panda3d/panda/src/testbed/indirect.cxx

174 lines
4.6 KiB
C++

// Filename: indirect.cxx
// Created by: cary (25Mar99)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
//
// All use of this software is subject to the terms of the Panda 3d
// Software license. You should have received a copy of this license
// along with this source code; you will also find a current copy of
// the license at http://www.panda3d.org/license.txt .
//
// To contact the maintainers of this program write to
// panda3d@yahoogroups.com .
//
////////////////////////////////////////////////////////////////////
#include <eventHandler.h>
#include <texture.h>
#include <graphicsWindow.h>
#include <graphicsStateGuardian.h>
#include <pixelBuffer.h>
#include <dconfig.h>
#include <chancfg.h>
#include <string>
Configure(indirect);
extern GraphicsWindow* win;
extern std::string chan_config;
extern int framework_main(int argc, char *argv[]);
extern void (*extra_display_func)();
extern void (*define_keys)(EventHandler&);
extern void (*first_init)();
Texture* t = (Texture*)0L;
PixelBuffer* pb = (PixelBuffer *)0L;
DisplayRegion* dr1 = (DisplayRegion*)0L;
DisplayRegion* dr2 = (DisplayRegion*)0L;
bool use_canned_texture = indirect.GetBool("canned-texture", false);
bool use_texture = indirect.GetBool("use-texture", true);
bool full_region = indirect.GetBool("full-region", true);
bool side_by_side = indirect.GetBool("side-by-side", true);
bool right_to_left = indirect.GetBool("right-to-left", true);
int logs[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 0 };
int binary_log_cap(int x) {
int i = 0;
for (; (x > logs[i])&&(logs[i] != 0); ++i);
if (logs[i] == 0)
return 4096;
return logs[i];
}
void indirect_display_func( void ) {
GraphicsStateGuardian* g = win->get_gsg();
const RenderBuffer& rf = g->get_render_buffer(RenderBuffer::T_front);
const RenderBuffer& rb = g->get_render_buffer(RenderBuffer::T_back);
if (use_texture) {
if (t == (Texture*)0L) {
t = new Texture;
if (use_canned_texture)
t->read( "smiley.rgba" );
else if (full_region) {
int a, b, w, h;
dr1->get_region_pixels(a, b, w, h);
t->_pbuffer->set_xsize(binary_log_cap(w));
t->_pbuffer->set_ysize(binary_log_cap(h));
} else {
t->_pbuffer->set_xsize( 512 );
t->_pbuffer->set_ysize( 512 );
}
}
if (side_by_side) {
if (right_to_left)
g->prepare_display_region(dr2);
else
g->prepare_display_region(dr1);
}
if (!use_canned_texture) {
if (full_region) {
if (side_by_side) {
if (right_to_left)
t->copy_from( rb, dr2 );
else
t->copy_from( rb, dr1 );
} else
t->copy_from( rb, dr1 );
} else
t->copy_from( rb );
}
if (side_by_side) {
if (right_to_left)
g->prepare_display_region(dr1);
else
g->prepare_display_region(dr2);
}
if (full_region) {
if (side_by_side) {
if (right_to_left)
t->draw_to( rf, dr1 );
else
t->draw_to( rf, dr2 );
} else
t->draw_to( rf, dr1 );
} else
t->draw_to( rf );
} else {
if (pb == (PixelBuffer*)0L) {
pb = new PixelBuffer;
if (use_canned_texture)
pb->read( "smiley.rgba" );
else if (full_region) {
int a, b, w, h;
dr1->get_region_pixels(a, b, w, h);
w = binary_log_cap(w);
h = binary_log_cap(h);
pb->set_xsize(w);
pb->set_ysize(h);
pb->_image = PTA_uchar(w * h * 3);
} else {
pb->set_xsize(512);
pb->set_ysize(512);
pb->_image = PTA_uchar(512 * 512 * 3);
}
}
if (side_by_side) {
if (right_to_left)
g->prepare_display_region(dr2);
else
g->prepare_display_region(dr1);
}
if (!use_canned_texture)
pb->copy_from( rf );
if (side_by_side) {
if (right_to_left)
g->prepare_display_region(dr1);
else
g->prepare_display_region(dr2);
}
pb->draw_to( rf );
}
}
void indirect_init(void) {
if (side_by_side)
chan_config = "two-frame";
}
void indirect_keys(EventHandler&) {
DRList::iterator i = win->getDRBegin();
dr1 = *i;
if (side_by_side) {
++i;
dr2 = *i;
if (right_to_left)
dr1->set_active(false);
else
dr2->set_active(false);
}
}
int main(int argc, char *argv[]) {
define_keys = &indirect_keys;
extra_display_func = &indirect_display_func;
first_init = &indirect_init;
return framework_main(argc, argv);
}