* rewrite and fix 2d background image feature; fix bug on intels (glPushAttrib)
This commit is contained in:
parent
1f4143ece2
commit
e7fec22b52
|
|
@ -2249,7 +2249,7 @@ GtkMenuItem* create_misc_menu(){
|
||||||
create_menu_item_with_mnemonic( menu, "Map Info...", "MapInfo" );
|
create_menu_item_with_mnemonic( menu, "Map Info...", "MapInfo" );
|
||||||
// http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=394
|
// http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=394
|
||||||
// create_menu_item_with_mnemonic(menu, "_Print XY View", FreeCaller<WXY_Print>());
|
// create_menu_item_with_mnemonic(menu, "_Print XY View", FreeCaller<WXY_Print>());
|
||||||
create_menu_item_with_mnemonic( menu, "_Background image...", FreeCaller<WXY_BackgroundSelect>() );
|
create_menu_item_with_mnemonic( menu, "Set 2D _Background image...", FreeCaller<WXY_SetBackgroundImage>() );
|
||||||
create_menu_item_with_mnemonic( menu, "Fullscreen", "Fullscreen" );
|
create_menu_item_with_mnemonic( menu, "Fullscreen", "Fullscreen" );
|
||||||
create_menu_item_with_mnemonic( menu, "Maximize view", "MaximizeView" );
|
create_menu_item_with_mnemonic( menu, "Maximize view", "MaximizeView" );
|
||||||
return misc_menu_item;
|
return misc_menu_item;
|
||||||
|
|
|
||||||
|
|
@ -625,13 +625,6 @@ XYWnd::XYWnd() :
|
||||||
m_fScale = 1;
|
m_fScale = 1;
|
||||||
m_viewType = XY;
|
m_viewType = XY;
|
||||||
|
|
||||||
m_backgroundActivated = false;
|
|
||||||
m_alpha = 1.0f;
|
|
||||||
m_xmin = 0.0f;
|
|
||||||
m_ymin = 0.0f;
|
|
||||||
m_xmax = 0.0f;
|
|
||||||
m_ymax = 0.0f;
|
|
||||||
|
|
||||||
m_entityCreate = false;
|
m_entityCreate = false;
|
||||||
|
|
||||||
m_mnuDrop = 0;
|
m_mnuDrop = 0;
|
||||||
|
|
@ -1263,75 +1256,129 @@ void XYWnd::XY_SnapToGrid( Vector3& point ){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void XYWnd::XY_LoadBackgroundImage( const char *name ){
|
|
||||||
const char* relative = path_make_relative( name, GlobalFileSystem().findRoot( name ) );
|
void BackgroundImage::render( const VIEWTYPE viewtype ){
|
||||||
if ( relative == name ) {
|
if( viewtype == _viewtype && _tex > 0 ){
|
||||||
globalWarningStream() << "WARNING: could not extract the relative path, using full path instead\n";
|
// glPushAttrib( GL_ALL_ATTRIB_BITS ); //bug with intel
|
||||||
|
|
||||||
|
if ( GlobalOpenGL().GL_1_3() ) {
|
||||||
|
glActiveTexture( GL_TEXTURE0 );
|
||||||
|
glClientActiveTexture( GL_TEXTURE0 );
|
||||||
|
}
|
||||||
|
glEnable( GL_TEXTURE_2D );
|
||||||
|
glEnable( GL_BLEND );
|
||||||
|
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
||||||
|
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
|
||||||
|
// glPolygonMode( GL_FRONT, GL_FILL );
|
||||||
|
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
||||||
|
glDisable( GL_CULL_FACE );
|
||||||
|
glDisable( GL_DEPTH_TEST );
|
||||||
|
|
||||||
|
glBindTexture( GL_TEXTURE_2D, _tex );
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
|
||||||
|
|
||||||
|
glBegin( GL_QUADS );
|
||||||
|
|
||||||
|
glColor4f( 1, 1, 1, _alpha );
|
||||||
|
glTexCoord2f( 0, 1 );
|
||||||
|
glVertex2f( _xmin, _ymin );
|
||||||
|
|
||||||
|
glTexCoord2f( 1, 1 );
|
||||||
|
glVertex2f( _xmax, _ymin );
|
||||||
|
|
||||||
|
glTexCoord2f( 1, 0 );
|
||||||
|
glVertex2f( _xmax, _ymax );
|
||||||
|
|
||||||
|
glTexCoord2f( 0, 0 );
|
||||||
|
glVertex2f( _xmin, _ymax );
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
glBindTexture( GL_TEXTURE_2D, 0 );
|
||||||
|
|
||||||
|
// glPopAttrib();
|
||||||
}
|
}
|
||||||
|
|
||||||
char fileNameWithoutExt[512];
|
|
||||||
strncpy( fileNameWithoutExt, relative, sizeof( fileNameWithoutExt ) - 1 );
|
|
||||||
fileNameWithoutExt[512 - 1] = '\0';
|
|
||||||
fileNameWithoutExt[strlen( fileNameWithoutExt ) - 4] = '\0';
|
|
||||||
|
|
||||||
Image *image = QERApp_LoadImage( 0, fileNameWithoutExt );
|
|
||||||
if ( !image ) {
|
|
||||||
globalErrorStream() << "Could not load texture " << fileNameWithoutExt << "\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_pParentWnd->ActiveXY()->m_tex = (qtexture_t*)malloc( sizeof( qtexture_t ) );
|
|
||||||
LoadTextureRGBA( g_pParentWnd->ActiveXY()->XYWnd::m_tex, image->getRGBAPixels(), image->getWidth(), image->getHeight() );
|
|
||||||
globalOutputStream() << "Loaded background texture " << relative << "\n";
|
|
||||||
g_pParentWnd->ActiveXY()->m_backgroundActivated = true;
|
|
||||||
|
|
||||||
int m_ix, m_iy;
|
|
||||||
switch ( g_pParentWnd->ActiveXY()->m_viewType )
|
|
||||||
{
|
|
||||||
case XY:
|
|
||||||
m_ix = 0;
|
|
||||||
m_iy = 1;
|
|
||||||
break;
|
|
||||||
case XZ:
|
|
||||||
m_ix = 0;
|
|
||||||
m_iy = 2;
|
|
||||||
break;
|
|
||||||
default: //case YZ:
|
|
||||||
m_ix = 1;
|
|
||||||
m_iy = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector3 min, max;
|
|
||||||
Select_GetBounds( min, max );
|
|
||||||
g_pParentWnd->ActiveXY()->m_xmin = min[m_ix];
|
|
||||||
g_pParentWnd->ActiveXY()->m_ymin = min[m_iy];
|
|
||||||
g_pParentWnd->ActiveXY()->m_xmax = max[m_ix];
|
|
||||||
g_pParentWnd->ActiveXY()->m_ymax = max[m_iy];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XYWnd::XY_DisableBackground( void ){
|
#include "qe3.h"
|
||||||
g_pParentWnd->ActiveXY()->m_backgroundActivated = false;
|
#include "os/file.h"
|
||||||
if ( g_pParentWnd->ActiveXY()->m_tex ) {
|
const char* BackgroundImage::background_image_dialog(){
|
||||||
free( g_pParentWnd->ActiveXY()->m_tex );
|
StringOutputStream buffer( 1024 );
|
||||||
|
|
||||||
|
buffer << g_qeglobals.m_userGamePath.c_str() << "textures/";
|
||||||
|
|
||||||
|
if ( !file_readable( buffer.c_str() ) ) {
|
||||||
|
// just go to fsmain
|
||||||
|
buffer.clear();
|
||||||
|
buffer << g_qeglobals.m_userGamePath.c_str() << "/";
|
||||||
}
|
}
|
||||||
g_pParentWnd->ActiveXY()->m_tex = NULL;
|
|
||||||
|
const char *filename = file_dialog( GTK_WIDGET( MainFrame_getWindow() ), TRUE, "Background Image", buffer.c_str(), NULL );
|
||||||
|
if ( filename != 0 ) {
|
||||||
|
// use VFS to get the correct relative path
|
||||||
|
const char* relative = path_make_relative( filename, GlobalFileSystem().findRoot( filename ) );
|
||||||
|
if ( relative == filename ) {
|
||||||
|
globalWarningStream() << "WARNING: could not extract the relative path, using full path instead\n";
|
||||||
|
}
|
||||||
|
return relative;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WXY_BackgroundSelect( void ){
|
void BackgroundImage::free_tex(){
|
||||||
bool brushesSelected = Scene_countSelectedBrushes( GlobalSceneGraph() ) != 0;
|
if( _tex > 0 ){
|
||||||
if ( !brushesSelected ) {
|
glDeleteTextures( 1, &_tex );
|
||||||
gtk_MessageBox( 0, "You have to select some brushes to get the bounding box for.\n",
|
_tex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackgroundImage::set( const VIEWTYPE viewtype ){
|
||||||
|
const AABB bounds = GlobalSelectionSystem().getBoundsSelected();
|
||||||
|
const int nDim1 = ( viewtype == YZ ) ? 1 : 0;
|
||||||
|
const int nDim2 = ( viewtype == XY ) ? 1 : 2;
|
||||||
|
if( !( bounds.extents[nDim1] > 0 && bounds.extents[nDim2] > 0 ) ){
|
||||||
|
gtk_MessageBox( GTK_WIDGET( MainFrame_getWindow() ), "Select some objects to get the bounding box for image.\n",
|
||||||
"No selection", eMB_OK, eMB_ICONERROR );
|
"No selection", eMB_OK, eMB_ICONERROR );
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
free_tex();
|
||||||
|
const char *filename = background_image_dialog();
|
||||||
|
if( filename ){
|
||||||
|
StringOutputStream filename_noext( 1024 );
|
||||||
|
const char* ext = path_get_extension( filename );
|
||||||
|
if( string_empty( ext ) )
|
||||||
|
filename_noext << filename;
|
||||||
|
else
|
||||||
|
filename_noext << StringRange( filename, ext - 1 );
|
||||||
|
|
||||||
const char *filename = file_dialog( GTK_WIDGET( MainFrame_getWindow() ), TRUE, "Background Image", NULL, NULL );
|
Image *image = QERApp_LoadImage( 0, filename_noext.c_str() );
|
||||||
g_pParentWnd->ActiveXY()->XY_DisableBackground();
|
if ( !image ) {
|
||||||
if ( filename ) {
|
globalErrorStream() << "Could not load texture " << filename_noext.c_str() << "\n";
|
||||||
g_pParentWnd->ActiveXY()->XY_LoadBackgroundImage( filename );
|
}
|
||||||
|
else{
|
||||||
|
qtexture_t* qtex = (qtexture_t*)malloc( sizeof( qtexture_t ) ); /* srs hack :E */
|
||||||
|
LoadTextureRGBA( qtex, image->getRGBAPixels(), image->getWidth(), image->getHeight() );
|
||||||
|
if( qtex->texture_number > 0 ){
|
||||||
|
globalOutputStream() << "Loaded background texture " << filename << "\n";
|
||||||
|
_tex = qtex->texture_number;
|
||||||
|
_viewtype = viewtype;
|
||||||
|
|
||||||
|
_xmin = bounds.origin[nDim1] - bounds.extents[nDim1];
|
||||||
|
_ymin = bounds.origin[nDim2] - bounds.extents[nDim2];
|
||||||
|
_xmax = bounds.origin[nDim1] + bounds.extents[nDim1];
|
||||||
|
_ymax = bounds.origin[nDim2] + bounds.extents[nDim2];
|
||||||
|
}
|
||||||
|
image->release();
|
||||||
|
free( qtex );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WXY_SetBackgroundImage(){
|
||||||
|
g_pParentWnd->ActiveXY()->setBackgroundImage();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============================================================================
|
============================================================================
|
||||||
|
|
||||||
|
|
@ -1498,40 +1545,6 @@ void XYWnd::RenderActive( void ){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void XYWnd::XY_DrawBackground( void ){
|
|
||||||
glPushAttrib( GL_ALL_ATTRIB_BITS );
|
|
||||||
|
|
||||||
glEnable( GL_TEXTURE_2D );
|
|
||||||
glEnable( GL_BLEND );
|
|
||||||
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
|
||||||
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
|
|
||||||
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
|
|
||||||
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
|
|
||||||
|
|
||||||
glPolygonMode( GL_FRONT, GL_FILL );
|
|
||||||
|
|
||||||
glBindTexture( GL_TEXTURE_2D, m_tex->texture_number );
|
|
||||||
glBegin( GL_QUADS );
|
|
||||||
|
|
||||||
glColor4f( 1.0, 1.0, 1.0, m_alpha );
|
|
||||||
glTexCoord2f( 0.0, 1.0 );
|
|
||||||
glVertex2f( m_xmin, m_ymin );
|
|
||||||
|
|
||||||
glTexCoord2f( 1.0, 1.0 );
|
|
||||||
glVertex2f( m_xmax, m_ymin );
|
|
||||||
|
|
||||||
glTexCoord2f( 1.0, 0.0 );
|
|
||||||
glVertex2f( m_xmax, m_ymax );
|
|
||||||
|
|
||||||
glTexCoord2f( 0.0, 0.0 );
|
|
||||||
glVertex2f( m_xmin, m_ymax );
|
|
||||||
|
|
||||||
glEnd();
|
|
||||||
glBindTexture( GL_TEXTURE_2D, 0 );
|
|
||||||
|
|
||||||
glPopAttrib();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XYWnd::XY_DrawGrid( void ) {
|
void XYWnd::XY_DrawGrid( void ) {
|
||||||
float x, y, xb, xe, yb, ye;
|
float x, y, xb, xe, yb, ye;
|
||||||
float w, h, a;
|
float w, h, a;
|
||||||
|
|
@ -2285,9 +2298,8 @@ void XYWnd::XY_Draw(){
|
||||||
glDisable( GL_COLOR_MATERIAL );
|
glDisable( GL_COLOR_MATERIAL );
|
||||||
glDisable( GL_DEPTH_TEST );
|
glDisable( GL_DEPTH_TEST );
|
||||||
|
|
||||||
if ( m_backgroundActivated ) {
|
m_backgroundImage.render( m_viewType );
|
||||||
XY_DrawBackground();
|
|
||||||
}
|
|
||||||
XY_DrawGrid();
|
XY_DrawGrid();
|
||||||
|
|
||||||
if ( g_xywindow_globals_private.show_blocks ) {
|
if ( g_xywindow_globals_private.show_blocks ) {
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,25 @@ inline const char* ViewType_getTitle( VIEWTYPE viewtype ){
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class BackgroundImage
|
||||||
|
{
|
||||||
|
GLuint _tex;
|
||||||
|
const float _alpha;
|
||||||
|
float _xmin, _ymin, _xmax, _ymax;
|
||||||
|
VIEWTYPE _viewtype;
|
||||||
|
public:
|
||||||
|
BackgroundImage() : _tex( 0 ), _alpha( 1 ){
|
||||||
|
}
|
||||||
|
~BackgroundImage(){
|
||||||
|
free_tex();
|
||||||
|
}
|
||||||
|
void set( const VIEWTYPE viewtype );
|
||||||
|
void render( const VIEWTYPE viewtype );
|
||||||
|
private:
|
||||||
|
const char* background_image_dialog();
|
||||||
|
void free_tex();
|
||||||
|
};
|
||||||
|
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
class FBO;
|
class FBO;
|
||||||
|
|
||||||
|
|
@ -107,9 +126,6 @@ void DrawCameraIcon( const Vector3& origin, const Vector3& angles );
|
||||||
void XY_DrawBlockGrid();
|
void XY_DrawBlockGrid();
|
||||||
void XY_DrawAxis();
|
void XY_DrawAxis();
|
||||||
void XY_DrawGrid();
|
void XY_DrawGrid();
|
||||||
void XY_DrawBackground();
|
|
||||||
void XY_LoadBackgroundImage( const char *name );
|
|
||||||
void XY_DisableBackground();
|
|
||||||
|
|
||||||
void XY_MouseUp( int x, int y, unsigned int buttons );
|
void XY_MouseUp( int x, int y, unsigned int buttons );
|
||||||
void XY_MouseDown( int x, int y, unsigned int buttons );
|
void XY_MouseDown( int x, int y, unsigned int buttons );
|
||||||
|
|
@ -170,12 +186,13 @@ Matrix4 m_modelview;
|
||||||
|
|
||||||
int m_nWidth;
|
int m_nWidth;
|
||||||
int m_nHeight;
|
int m_nHeight;
|
||||||
// background image stuff
|
|
||||||
qtexture_t *m_tex;
|
void setBackgroundImage(){
|
||||||
bool m_backgroundActivated;
|
m_backgroundImage.set( m_viewType );
|
||||||
float m_alpha; // vertex alpha
|
}
|
||||||
float m_xmin, m_ymin, m_xmax, m_ymax;
|
|
||||||
private:
|
private:
|
||||||
|
BackgroundImage m_backgroundImage;
|
||||||
|
|
||||||
float m_fScale;
|
float m_fScale;
|
||||||
Vector3 m_vOrigin;
|
Vector3 m_vOrigin;
|
||||||
|
|
||||||
|
|
@ -302,7 +319,7 @@ void XYWindow_Construct();
|
||||||
void XYWindow_Destroy();
|
void XYWindow_Destroy();
|
||||||
|
|
||||||
void WXY_Print();
|
void WXY_Print();
|
||||||
void WXY_BackgroundSelect();
|
void WXY_SetBackgroundImage();
|
||||||
|
|
||||||
void XYShow_registerCommands();
|
void XYShow_registerCommands();
|
||||||
void XYWnd_registerShortcuts();
|
void XYWnd_registerShortcuts();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user