230 lines
6.6 KiB
C
230 lines
6.6 KiB
C
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file callbackGraphicsWindow.h
|
||
|
* @author drose
|
||
|
* @date 2011-01-06
|
||
|
*/
|
||
|
|
||
|
#ifndef CALLBACKGRAPHICSWINDOW_H
|
||
|
#define CALLBACKGRAPHICSWINDOW_H
|
||
|
|
||
|
#include "pandabase.h"
|
||
|
#include "graphicsWindow.h"
|
||
|
|
||
|
/**
|
||
|
* This special window object doesn't represent a window in its own right, but
|
||
|
* instead hooks into some third-party API for creating and rendering to
|
||
|
* windows via callbacks. This can be used to allow Panda to render into an
|
||
|
* already-created OpenGL context, for instance.
|
||
|
*/
|
||
|
class EXPCL_PANDA_DISPLAY CallbackGraphicsWindow : public GraphicsWindow {
|
||
|
protected:
|
||
|
CallbackGraphicsWindow(GraphicsEngine *engine,
|
||
|
GraphicsPipe *pipe,
|
||
|
const std::string &name,
|
||
|
const FrameBufferProperties &fb_prop,
|
||
|
const WindowProperties &win_prop,
|
||
|
int flags,
|
||
|
GraphicsStateGuardian *gsg);
|
||
|
|
||
|
PUBLISHED:
|
||
|
virtual ~CallbackGraphicsWindow();
|
||
|
|
||
|
class EXPCL_PANDA_DISPLAY WindowCallbackData : public CallbackData {
|
||
|
public:
|
||
|
INLINE WindowCallbackData(CallbackGraphicsWindow *window);
|
||
|
|
||
|
PUBLISHED:
|
||
|
INLINE CallbackGraphicsWindow *get_window() const;
|
||
|
MAKE_PROPERTY(window, get_window);
|
||
|
|
||
|
protected:
|
||
|
PT(CallbackGraphicsWindow) _window;
|
||
|
|
||
|
public:
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
static void init_type() {
|
||
|
CallbackData::init_type();
|
||
|
register_type(_type_handle, "CallbackGraphicsWindow::WindowCallbackData",
|
||
|
CallbackData::get_class_type());
|
||
|
}
|
||
|
virtual TypeHandle get_type() const {
|
||
|
return get_class_type();
|
||
|
}
|
||
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||
|
|
||
|
private:
|
||
|
static TypeHandle _type_handle;
|
||
|
};
|
||
|
|
||
|
class EXPCL_PANDA_DISPLAY EventsCallbackData : public WindowCallbackData {
|
||
|
public:
|
||
|
INLINE EventsCallbackData(CallbackGraphicsWindow *window);
|
||
|
|
||
|
PUBLISHED:
|
||
|
virtual void upcall();
|
||
|
|
||
|
public:
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
static void init_type() {
|
||
|
WindowCallbackData::init_type();
|
||
|
register_type(_type_handle, "CallbackGraphicsWindow::EventsCallbackData",
|
||
|
WindowCallbackData::get_class_type());
|
||
|
}
|
||
|
virtual TypeHandle get_type() const {
|
||
|
return get_class_type();
|
||
|
}
|
||
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||
|
|
||
|
private:
|
||
|
static TypeHandle _type_handle;
|
||
|
};
|
||
|
|
||
|
class EXPCL_PANDA_DISPLAY PropertiesCallbackData : public WindowCallbackData {
|
||
|
public:
|
||
|
INLINE PropertiesCallbackData(CallbackGraphicsWindow *window, WindowProperties &properties);
|
||
|
|
||
|
PUBLISHED:
|
||
|
INLINE WindowProperties &get_properties() const;
|
||
|
|
||
|
virtual void upcall();
|
||
|
|
||
|
private:
|
||
|
WindowProperties &_properties;
|
||
|
|
||
|
public:
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
static void init_type() {
|
||
|
WindowCallbackData::init_type();
|
||
|
register_type(_type_handle, "CallbackGraphicsWindow::PropertiesCallbackData",
|
||
|
WindowCallbackData::get_class_type());
|
||
|
}
|
||
|
virtual TypeHandle get_type() const {
|
||
|
return get_class_type();
|
||
|
}
|
||
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||
|
|
||
|
private:
|
||
|
static TypeHandle _type_handle;
|
||
|
};
|
||
|
|
||
|
enum RenderCallbackType {
|
||
|
RCT_begin_frame,
|
||
|
RCT_end_frame,
|
||
|
RCT_begin_flip,
|
||
|
RCT_end_flip,
|
||
|
};
|
||
|
|
||
|
class EXPCL_PANDA_DISPLAY RenderCallbackData : public WindowCallbackData {
|
||
|
public:
|
||
|
INLINE RenderCallbackData(CallbackGraphicsWindow *window, RenderCallbackType callback_type, FrameMode frame_mode);
|
||
|
|
||
|
PUBLISHED:
|
||
|
INLINE CallbackGraphicsWindow::RenderCallbackType get_callback_type() const;
|
||
|
INLINE GraphicsOutput::FrameMode get_frame_mode() const;
|
||
|
MAKE_PROPERTY(callback_type, get_callback_type);
|
||
|
MAKE_PROPERTY(frame_mode, get_frame_mode);
|
||
|
|
||
|
INLINE void set_render_flag(bool render_flag);
|
||
|
INLINE bool get_render_flag() const;
|
||
|
MAKE_PROPERTY(render_flag, get_render_flag, set_render_flag);
|
||
|
|
||
|
virtual void upcall();
|
||
|
|
||
|
private:
|
||
|
RenderCallbackType _callback_type;
|
||
|
FrameMode _frame_mode;
|
||
|
bool _render_flag;
|
||
|
|
||
|
public:
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
static void init_type() {
|
||
|
WindowCallbackData::init_type();
|
||
|
register_type(_type_handle, "CallbackGraphicsWindow::RenderCallbackData",
|
||
|
WindowCallbackData::get_class_type());
|
||
|
}
|
||
|
virtual TypeHandle get_type() const {
|
||
|
return get_class_type();
|
||
|
}
|
||
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||
|
|
||
|
private:
|
||
|
static TypeHandle _type_handle;
|
||
|
};
|
||
|
|
||
|
INLINE void set_events_callback(CallbackObject *object);
|
||
|
INLINE void clear_events_callback();
|
||
|
INLINE CallbackObject *get_events_callback() const;
|
||
|
|
||
|
INLINE void set_properties_callback(CallbackObject *object);
|
||
|
INLINE void clear_properties_callback();
|
||
|
INLINE CallbackObject *get_properties_callback() const;
|
||
|
|
||
|
INLINE void set_render_callback(CallbackObject *object);
|
||
|
INLINE void clear_render_callback();
|
||
|
INLINE CallbackObject *get_render_callback() const;
|
||
|
|
||
|
int create_input_device(const std::string &name);
|
||
|
|
||
|
public:
|
||
|
virtual bool begin_frame(FrameMode mode, Thread *current_thread);
|
||
|
virtual void end_frame(FrameMode mode, Thread *current_thread);
|
||
|
|
||
|
virtual void begin_flip();
|
||
|
virtual void end_flip();
|
||
|
|
||
|
virtual void process_events();
|
||
|
virtual void set_properties_now(WindowProperties &properties);
|
||
|
|
||
|
protected:
|
||
|
virtual bool open_window();
|
||
|
virtual bool do_reshape_request(int x_origin, int y_origin, bool has_origin,
|
||
|
int x_size, int y_size);
|
||
|
|
||
|
private:
|
||
|
PT(CallbackObject) _events_callback;
|
||
|
PT(CallbackObject) _properties_callback;
|
||
|
PT(CallbackObject) _render_callback;
|
||
|
|
||
|
public:
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
static void init_type() {
|
||
|
GraphicsWindow::init_type();
|
||
|
register_type(_type_handle, "CallbackGraphicsWindow",
|
||
|
GraphicsWindow::get_class_type());
|
||
|
WindowCallbackData::init_type();
|
||
|
EventsCallbackData::init_type();
|
||
|
PropertiesCallbackData::init_type();
|
||
|
RenderCallbackData::init_type();
|
||
|
}
|
||
|
virtual TypeHandle get_type() const {
|
||
|
return get_class_type();
|
||
|
}
|
||
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||
|
|
||
|
private:
|
||
|
static TypeHandle _type_handle;
|
||
|
|
||
|
friend class GraphicsEngine;
|
||
|
};
|
||
|
|
||
|
#include "callbackGraphicsWindow.I"
|
||
|
|
||
|
#endif
|