Alibek Omarov
3 years ago
11 changed files with 0 additions and 1120 deletions
@ -1,23 +0,0 @@ |
|||||||
LOCAL_PATH := $(call my-dir) |
|
||||||
|
|
||||||
include $(CLEAR_VARS) |
|
||||||
|
|
||||||
LOCAL_MODULE = vgui_support |
|
||||||
|
|
||||||
include $(XASH3D_CONFIG) |
|
||||||
|
|
||||||
LOCAL_CFLAGS = -fsigned-char -DVGUI_TOUCH_SCROLL -DNO_STL -DXASH_GLES -DINTERNAL_VGUI_SUPPORT -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable |
|
||||||
|
|
||||||
LOCAL_CPPFLAGS = -frtti -fno-exceptions -Wno-write-strings -Wno-invalid-offsetof -std=gnu++98 |
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := \
|
|
||||||
$(LOCAL_PATH)/../common \
|
|
||||||
$(LOCAL_PATH)/../engine \
|
|
||||||
$(HLSDK_PATH)/utils/vgui/include \
|
|
||||||
$(VGUI_DIR)/include |
|
||||||
|
|
||||||
LOCAL_SRC_FILES := vgui_clip.cpp vgui_font.cpp vgui_input.cpp vgui_int.cpp vgui_surf.cpp |
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := vgui |
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY) |
|
@ -1,29 +0,0 @@ |
|||||||
CC ?= gcc -m32 |
|
||||||
CXX ?= g++ -m32 -std=gnu++98 |
|
||||||
CFLAGS ?= -O2 -ggdb -fPIC |
|
||||||
TOPDIR = $(PWD)/.. |
|
||||||
VGUI_DIR ?= ./vgui-dev |
|
||||||
INCLUDES = -I../common -I../engine -I../engine/common -I../engine/client -I../engine/client/vgui -I../pm_shared |
|
||||||
INCLUDES += -I$(VGUI_DIR)/include/ |
|
||||||
DEFINES = -DNO_STL |
|
||||||
%.o : %.cpp |
|
||||||
$(CXX) $(CFLAGS) $(INCLUDES) $(DEFINES) -c $< -o $@ |
|
||||||
|
|
||||||
SRCS = $(wildcard *.cpp) |
|
||||||
OBJS = $(SRCS:.cpp=.o) |
|
||||||
|
|
||||||
libvgui_support.so : $(OBJS) |
|
||||||
$(CXX) $(LDFLAGS) -o libvgui_support.so -shared $(OBJS) vgui.so |
|
||||||
|
|
||||||
.PHONY: depend clean |
|
||||||
|
|
||||||
clean : |
|
||||||
$(RM) $(OBJS) libvgui_support.so |
|
||||||
|
|
||||||
depend: Makefile.dep |
|
||||||
|
|
||||||
Makefile.dep: $(SRCS) |
|
||||||
rm -f ./Makefile.dep |
|
||||||
$(CC) $(CFLAGS) $(INCLUDES) $(DEFINES) -MM $^>>./Makefile.dep |
|
||||||
|
|
||||||
include Makefile.dep |
|
@ -1,5 +0,0 @@ |
|||||||
set MSVCDir=Z:\path\to\msvc |
|
||||||
set INCLUDE=%MSVCDir%\include |
|
||||||
set LIB=%MSVCDir%\lib |
|
||||||
set PATH=%MSVCDir%\bin;%PATH% |
|
||||||
cl.exe %* |
|
@ -1,124 +0,0 @@ |
|||||||
/*
|
|
||||||
vgui_clip.cpp - clip in 2D space |
|
||||||
Copyright (C) 2011 Uncle Mike |
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify |
|
||||||
it under the terms of the GNU General Public License as published by |
|
||||||
the Free Software Foundation, either version 3 of the License, or |
|
||||||
(at your option) any later version. |
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, |
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
GNU General Public License for more details. |
|
||||||
|
|
||||||
In addition, as a special exception, the author gives permission |
|
||||||
to link the code of this program with VGUI library developed by |
|
||||||
Valve, L.L.C ("Valve"). You must obey the GNU General Public License |
|
||||||
in all respects for all of the code used other than VGUI library. |
|
||||||
If you modify this file, you may extend this exception to your |
|
||||||
version of the file, but you are not obligated to do so. If |
|
||||||
you do not wish to do so, delete this exception statement |
|
||||||
from your version. |
|
||||||
|
|
||||||
*/ |
|
||||||
|
|
||||||
#include "vgui_main.h" |
|
||||||
#include "wrect.h" |
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// For simulated scissor tests...
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
static wrect_t g_ScissorRect; |
|
||||||
static qboolean g_bScissor = false; |
|
||||||
namespace vgui_support { |
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// Enable/disable scissoring...
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
void EnableScissor( qboolean enable ) |
|
||||||
{ |
|
||||||
g_bScissor = enable; |
|
||||||
} |
|
||||||
|
|
||||||
void SetScissorRect( int left, int top, int right, int bottom ) |
|
||||||
{ |
|
||||||
// Check for a valid rectangle...
|
|
||||||
assert( left <= right ); |
|
||||||
assert( top <= bottom ); |
|
||||||
|
|
||||||
g_ScissorRect.left = left; |
|
||||||
g_ScissorRect.top = top; |
|
||||||
g_ScissorRect.right = right; |
|
||||||
g_ScissorRect.bottom = bottom; |
|
||||||
} |
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// Purpose: Used for clipping, produces an interpolated texture coordinate
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
inline float InterpTCoord( float val, float mins, float maxs, float tMin, float tMax ) |
|
||||||
{ |
|
||||||
float flPercent; |
|
||||||
|
|
||||||
if( mins != maxs ) |
|
||||||
flPercent = (float)(val - mins) / (maxs - mins); |
|
||||||
else flPercent = 0.5f; |
|
||||||
|
|
||||||
return tMin + (tMax - tMin) * flPercent; |
|
||||||
} |
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// Purpose: Does a scissor clip of the input rectangle.
|
|
||||||
// Returns false if it is completely clipped off.
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
qboolean ClipRect( const vpoint_t &inUL, const vpoint_t &inLR, vpoint_t *pOutUL, vpoint_t *pOutLR ) |
|
||||||
{ |
|
||||||
if( g_bScissor ) |
|
||||||
{ |
|
||||||
// pick whichever left side is larger
|
|
||||||
if( g_ScissorRect.left > inUL.point[0] ) |
|
||||||
pOutUL->point[0] = g_ScissorRect.left; |
|
||||||
else |
|
||||||
pOutUL->point[0] = inUL.point[0]; |
|
||||||
|
|
||||||
// pick whichever right side is smaller
|
|
||||||
if( g_ScissorRect.right <= inLR.point[0] ) |
|
||||||
pOutLR->point[0] = g_ScissorRect.right; |
|
||||||
else |
|
||||||
pOutLR->point[0] = inLR.point[0]; |
|
||||||
|
|
||||||
// pick whichever top side is larger
|
|
||||||
if( g_ScissorRect.top > inUL.point[1] ) |
|
||||||
pOutUL->point[1] = g_ScissorRect.top; |
|
||||||
else |
|
||||||
pOutUL->point[1] = inUL.point[1]; |
|
||||||
|
|
||||||
// pick whichever bottom side is smaller
|
|
||||||
if( g_ScissorRect.bottom <= inLR.point[1] ) |
|
||||||
pOutLR->point[1] = g_ScissorRect.bottom; |
|
||||||
else |
|
||||||
pOutLR->point[1] = inLR.point[1]; |
|
||||||
|
|
||||||
// Check for non-intersecting
|
|
||||||
if(( pOutUL->point[0] > pOutLR->point[0] ) || ( pOutUL->point[1] > pOutLR->point[1] )) |
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
pOutUL->coord[0] = InterpTCoord(pOutUL->point[0], |
|
||||||
inUL.point[0], inLR.point[0], inUL.coord[0], inLR.coord[0] ); |
|
||||||
pOutLR->coord[0] = InterpTCoord(pOutLR->point[0], |
|
||||||
inUL.point[0], inLR.point[0], inUL.coord[0], inLR.coord[0] ); |
|
||||||
|
|
||||||
pOutUL->coord[1] = InterpTCoord(pOutUL->point[1], |
|
||||||
inUL.point[1], inLR.point[1], inUL.coord[1], inLR.coord[1] ); |
|
||||||
pOutLR->coord[1] = InterpTCoord(pOutLR->point[1], |
|
||||||
inUL.point[1], inLR.point[1], inUL.coord[1], inLR.coord[1] ); |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
*pOutUL = inUL; |
|
||||||
*pOutLR = inLR; |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
} |
|
@ -1,91 +0,0 @@ |
|||||||
/*
|
|
||||||
vgui_input.cpp - handle kb & mouse |
|
||||||
Copyright (C) 2011 Uncle Mike |
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify |
|
||||||
it under the terms of the GNU General Public License as published by |
|
||||||
the Free Software Foundation, either version 3 of the License, or |
|
||||||
(at your option) any later version. |
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, |
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
GNU General Public License for more details. |
|
||||||
|
|
||||||
In addition, as a special exception, the author gives permission |
|
||||||
to link the code of this program with VGUI library developed by |
|
||||||
Valve, L.L.C ("Valve"). You must obey the GNU General Public License |
|
||||||
in all respects for all of the code used other than VGUI library. |
|
||||||
If you modify this file, you may extend this exception to your |
|
||||||
version of the file, but you are not obligated to do so. If |
|
||||||
you do not wish to do so, delete this exception statement |
|
||||||
from your version. |
|
||||||
|
|
||||||
*/ |
|
||||||
|
|
||||||
#define OEMRESOURCE // for OCR_* cursor junk
|
|
||||||
|
|
||||||
#include "vgui_main.h" |
|
||||||
|
|
||||||
namespace vgui_support { |
|
||||||
void VGUI_Key(VGUI_KeyAction action, VGUI_KeyCode code) |
|
||||||
{ |
|
||||||
App *pApp = App::getInstance(); |
|
||||||
if(!surface) |
|
||||||
return; |
|
||||||
switch( action ) |
|
||||||
{ |
|
||||||
case KA_PRESSED: |
|
||||||
pApp->internalKeyPressed( (KeyCode) code, surface ); |
|
||||||
break; |
|
||||||
case KA_RELEASED: |
|
||||||
pApp->internalKeyReleased( (KeyCode) code, surface ); |
|
||||||
break; |
|
||||||
case KA_TYPED: |
|
||||||
pApp->internalKeyTyped( (KeyCode) code, surface ); |
|
||||||
break; |
|
||||||
} |
|
||||||
//fprintf(stdout,"vgui_support: VGUI key action %d %d\n", action, code);
|
|
||||||
//fflush(stdout);
|
|
||||||
} |
|
||||||
|
|
||||||
void VGUI_Mouse(VGUI_MouseAction action, int code) |
|
||||||
{ |
|
||||||
App *pApp = App::getInstance(); |
|
||||||
if(!surface) |
|
||||||
return; |
|
||||||
switch( action ) |
|
||||||
{ |
|
||||||
case MA_PRESSED: |
|
||||||
pApp->internalMousePressed( (MouseCode) code, surface ); |
|
||||||
break; |
|
||||||
case MA_RELEASED: |
|
||||||
pApp->internalMouseReleased( (MouseCode) code, surface ); |
|
||||||
break; |
|
||||||
case MA_DOUBLE: |
|
||||||
pApp->internalMouseDoublePressed( (MouseCode) code, surface ); |
|
||||||
break; |
|
||||||
case MA_WHEEL: |
|
||||||
//fprintf(stdout, "vgui_support: VGUI mouse wheeled %d %d\n", action, code);
|
|
||||||
pApp->internalMouseWheeled( code, surface ); |
|
||||||
break; |
|
||||||
} |
|
||||||
//fprintf(stdout, "vgui_support: VGUI mouse action %d %d\n", action, code);
|
|
||||||
//fflush(stdout);
|
|
||||||
} |
|
||||||
|
|
||||||
void VGUI_MouseMove(int x, int y) |
|
||||||
{ |
|
||||||
App *pApp = App::getInstance(); |
|
||||||
//fprintf(stdout, "vgui_support: VGUI mouse move %d %d %p\n", x, y, surface);
|
|
||||||
//fflush(stdout);
|
|
||||||
if(!surface) |
|
||||||
return; |
|
||||||
pApp->internalCursorMoved( x, y, surface ); |
|
||||||
} |
|
||||||
|
|
||||||
void VGUI_TextInput(const char *text) |
|
||||||
{ |
|
||||||
// stub
|
|
||||||
} |
|
||||||
} |
|
@ -1,123 +0,0 @@ |
|||||||
/*
|
|
||||||
vgui_int.c - vgui dll interaction |
|
||||||
Copyright (C) 2011 Uncle Mike |
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify |
|
||||||
it under the terms of the GNU General Public License as published by |
|
||||||
the Free Software Foundation, either version 3 of the License, or |
|
||||||
(at your option) any later version. |
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, |
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
GNU General Public License for more details. |
|
||||||
|
|
||||||
In addition, as a special exception, the author gives permission |
|
||||||
to link the code of this program with VGUI library developed by |
|
||||||
Valve, L.L.C ("Valve"). You must obey the GNU General Public License |
|
||||||
in all respects for all of the code used other than VGUI library. |
|
||||||
If you modify this file, you may extend this exception to your |
|
||||||
version of the file, but you are not obligated to do so. If |
|
||||||
you do not wish to do so, delete this exception statement |
|
||||||
from your version. |
|
||||||
|
|
||||||
*/ |
|
||||||
|
|
||||||
#include "vgui_main.h" |
|
||||||
#include "xash3d_types.h" |
|
||||||
namespace vgui_support { |
|
||||||
|
|
||||||
vguiapi_t *g_api; |
|
||||||
|
|
||||||
Panel *rootpanel = NULL; |
|
||||||
CEngineSurface *surface = NULL; |
|
||||||
CEngineApp staticApp; |
|
||||||
|
|
||||||
void VGui_Startup( int width, int height ) |
|
||||||
{ |
|
||||||
if( rootpanel ) |
|
||||||
{ |
|
||||||
rootpanel->setSize( width, height ); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
rootpanel = new Panel; |
|
||||||
rootpanel->setSize( width, height ); |
|
||||||
rootpanel->setPaintBorderEnabled( false ); |
|
||||||
rootpanel->setPaintBackgroundEnabled( false ); |
|
||||||
rootpanel->setVisible( true ); |
|
||||||
rootpanel->setCursor( new Cursor( Cursor::dc_none )); |
|
||||||
|
|
||||||
staticApp.start(); |
|
||||||
staticApp.setMinimumTickMillisInterval( 0 ); |
|
||||||
|
|
||||||
surface = new CEngineSurface( rootpanel ); |
|
||||||
rootpanel->setSurfaceBaseTraverse( surface ); |
|
||||||
|
|
||||||
|
|
||||||
//ASSERT( rootpanel->getApp() != NULL );
|
|
||||||
//ASSERT( rootpanel->getSurfaceBase() != NULL );
|
|
||||||
|
|
||||||
g_api->DrawInit (); |
|
||||||
} |
|
||||||
|
|
||||||
void VGui_Shutdown( void ) |
|
||||||
{ |
|
||||||
staticApp.stop(); |
|
||||||
|
|
||||||
delete rootpanel; |
|
||||||
delete surface; |
|
||||||
|
|
||||||
rootpanel = NULL; |
|
||||||
surface = NULL; |
|
||||||
} |
|
||||||
|
|
||||||
void VGui_Paint( void ) |
|
||||||
{ |
|
||||||
int w, h; |
|
||||||
|
|
||||||
//if( cls.state != ca_active || !rootpanel )
|
|
||||||
// return;
|
|
||||||
if( !g_api->IsInGame() || !rootpanel ) |
|
||||||
return; |
|
||||||
|
|
||||||
// setup the base panel to cover the screen
|
|
||||||
Panel *pVPanel = surface->getEmbeddedPanel(); |
|
||||||
if( !pVPanel ) return; |
|
||||||
//SDL_GetWindowSize(host.hWnd, &w, &h);
|
|
||||||
//host.input_enabled = rootpanel->isVisible();
|
|
||||||
rootpanel->getSize(w, h); |
|
||||||
EnableScissor( true ); |
|
||||||
|
|
||||||
staticApp.externalTick (); |
|
||||||
|
|
||||||
pVPanel->setBounds( 0, 0, w, h ); |
|
||||||
pVPanel->repaint(); |
|
||||||
|
|
||||||
// paint everything
|
|
||||||
pVPanel->paintTraverse(); |
|
||||||
|
|
||||||
EnableScissor( false ); |
|
||||||
} |
|
||||||
void *VGui_GetPanel( void ) |
|
||||||
{ |
|
||||||
return (void *)rootpanel; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
#ifdef INTERNAL_VGUI_SUPPORT |
|
||||||
#define InitAPI InitVGUISupportAPI |
|
||||||
#endif |
|
||||||
|
|
||||||
extern "C" EXPORT void InitAPI(vguiapi_t * api) |
|
||||||
{ |
|
||||||
g_api = api; |
|
||||||
g_api->Startup = VGui_Startup; |
|
||||||
g_api->Shutdown = VGui_Shutdown; |
|
||||||
g_api->GetPanel = VGui_GetPanel; |
|
||||||
g_api->Paint = VGui_Paint; |
|
||||||
g_api->Mouse = VGUI_Mouse; |
|
||||||
g_api->MouseMove = VGUI_MouseMove; |
|
||||||
g_api->Key = VGUI_Key; |
|
||||||
g_api->TextInput = VGUI_TextInput; |
|
||||||
} |
|
@ -1,156 +0,0 @@ |
|||||||
/*
|
|
||||||
vgui_main.h - vgui main header |
|
||||||
Copyright (C) 2011 Uncle Mike |
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify |
|
||||||
it under the terms of the GNU General Public License as published by |
|
||||||
the Free Software Foundation, either version 3 of the License, or |
|
||||||
(at your option) any later version. |
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, |
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
GNU General Public License for more details. |
|
||||||
|
|
||||||
In addition, as a special exception, the author gives permission |
|
||||||
to link the code of this program with VGUI library developed by |
|
||||||
Valve, L.L.C ("Valve"). You must obey the GNU General Public License |
|
||||||
in all respects for all of the code used other than VGUI library. |
|
||||||
If you modify this file, you may extend this exception to your |
|
||||||
version of the file, but you are not obligated to do so. If |
|
||||||
you do not wish to do so, delete this exception statement |
|
||||||
from your version. |
|
||||||
|
|
||||||
*/ |
|
||||||
#ifndef VGUI_MAIN_H |
|
||||||
#define VGUI_MAIN_H |
|
||||||
|
|
||||||
#ifdef _WIN32 |
|
||||||
#include <windows.h> |
|
||||||
#else |
|
||||||
#include <string.h> |
|
||||||
#endif |
|
||||||
|
|
||||||
#include <assert.h> |
|
||||||
|
|
||||||
#include "vgui_api.h" |
|
||||||
|
|
||||||
#include<VGUI.h> |
|
||||||
#include<VGUI_App.h> |
|
||||||
#include<VGUI_Font.h> |
|
||||||
#include<VGUI_Panel.h> |
|
||||||
#include<VGUI_Cursor.h> |
|
||||||
#include<VGUI_SurfaceBase.h> |
|
||||||
#include<VGUI_InputSignal.h> |
|
||||||
#include<VGUI_MouseCode.h> |
|
||||||
#include<VGUI_KeyCode.h> |
|
||||||
|
|
||||||
namespace vgui_support |
|
||||||
{ |
|
||||||
extern vguiapi_t *g_api; |
|
||||||
|
|
||||||
using namespace vgui; |
|
||||||
|
|
||||||
struct PaintStack |
|
||||||
{ |
|
||||||
Panel *m_pPanel; |
|
||||||
int iTranslateX; |
|
||||||
int iTranslateY; |
|
||||||
int iScissorLeft; |
|
||||||
int iScissorRight; |
|
||||||
int iScissorTop; |
|
||||||
int iScissorBottom; |
|
||||||
}; |
|
||||||
|
|
||||||
class CEngineSurface : public SurfaceBase |
|
||||||
{ |
|
||||||
private: |
|
||||||
|
|
||||||
// point translation for current panel
|
|
||||||
int _translateX; |
|
||||||
int _translateY; |
|
||||||
|
|
||||||
// the size of the window to draw into
|
|
||||||
int _surfaceExtents[4]; |
|
||||||
|
|
||||||
void SetupPaintState( const PaintStack *paintState ); |
|
||||||
void InitVertex( vpoint_t &vertex, int x, int y, float u, float v ); |
|
||||||
public: |
|
||||||
CEngineSurface( Panel *embeddedPanel ); |
|
||||||
~CEngineSurface(); |
|
||||||
public: |
|
||||||
virtual Panel *getEmbeddedPanel( void ); |
|
||||||
virtual bool setFullscreenMode( int wide, int tall, int bpp ); |
|
||||||
virtual void setWindowedMode( void ); |
|
||||||
virtual void setTitle( const char *title ) { } |
|
||||||
virtual void createPopup( Panel* embeddedPanel ) { } |
|
||||||
virtual bool isWithin( int x, int y ) { return true; } |
|
||||||
virtual bool hasFocus( void ); |
|
||||||
// now it's not abstract class, yay
|
|
||||||
virtual void GetMousePos(int &x, int &y) { |
|
||||||
g_api->GetCursorPos(&x, &y); |
|
||||||
} |
|
||||||
void drawPrintChar(int x, int y, int wide, int tall, float s0, float t0, float s1, float t1, int color[]); |
|
||||||
protected: |
|
||||||
virtual int createNewTextureID( void ); |
|
||||||
virtual void drawSetColor( int r, int g, int b, int a ); |
|
||||||
virtual void drawSetTextColor( int r, int g, int b, int a ); |
|
||||||
virtual void drawFilledRect( int x0, int y0, int x1, int y1 ); |
|
||||||
virtual void drawOutlinedRect( int x0,int y0,int x1,int y1 ); |
|
||||||
virtual void drawSetTextFont( Font *font ); |
|
||||||
virtual void drawSetTextPos( int x, int y ); |
|
||||||
virtual void drawPrintText( const char* text, int textLen ); |
|
||||||
virtual void drawSetTextureRGBA( int id, const char* rgba, int wide, int tall ); |
|
||||||
virtual void drawSetTexture( int id ); |
|
||||||
virtual void drawTexturedRect( int x0, int y0, int x1, int y1 ); |
|
||||||
virtual bool createPlat( void ) { return false; } |
|
||||||
virtual bool recreateContext( void ) { return false; } |
|
||||||
virtual void setCursor( Cursor* cursor ); |
|
||||||
virtual void pushMakeCurrent( Panel* panel, bool useInsets ); |
|
||||||
virtual void popMakeCurrent( Panel* panel ); |
|
||||||
|
|
||||||
// not used in engine instance
|
|
||||||
virtual void enableMouseCapture( bool state ) { } |
|
||||||
virtual void invalidate( Panel *panel ) { } |
|
||||||
virtual void setAsTopMost( bool state ) { } |
|
||||||
virtual void applyChanges( void ) { } |
|
||||||
virtual void swapBuffers( void ) { } |
|
||||||
protected: |
|
||||||
Cursor* _hCurrentCursor; |
|
||||||
int _drawTextPos[2]; |
|
||||||
int _drawColor[4]; |
|
||||||
int _drawTextColor[4]; |
|
||||||
friend class App; |
|
||||||
friend class Panel; |
|
||||||
}; |
|
||||||
|
|
||||||
// initialize VGUI::App as external (part of engine)
|
|
||||||
class CEngineApp : public App |
|
||||||
{ |
|
||||||
public: |
|
||||||
CEngineApp( bool externalMain = true ) : App( externalMain ) { } |
|
||||||
virtual void main( int argc, char* argv[] ) { } // stub
|
|
||||||
}; |
|
||||||
|
|
||||||
//
|
|
||||||
// vgui_input.cpp
|
|
||||||
//
|
|
||||||
void *VGui_GetPanel( void ); |
|
||||||
void VGui_Paint( void ); |
|
||||||
void VGUI_Mouse(VGUI_MouseAction action, int code); |
|
||||||
void VGUI_Key(VGUI_KeyAction action, VGUI_KeyCode code); |
|
||||||
void VGUI_MouseMove(int x, int y); |
|
||||||
void VGUI_TextInput(const char *text); |
|
||||||
|
|
||||||
//
|
|
||||||
// vgui_clip.cpp
|
|
||||||
//
|
|
||||||
void EnableScissor( qboolean enable ); |
|
||||||
void SetScissorRect( int left, int top, int right, int bottom ); |
|
||||||
qboolean ClipRect( const vpoint_t &inUL, const vpoint_t &inLR, vpoint_t *pOutUL, vpoint_t *pOutLR ); |
|
||||||
|
|
||||||
extern CEngineSurface *surface; |
|
||||||
extern Panel *root; |
|
||||||
} |
|
||||||
using namespace vgui_support; |
|
||||||
#endif//VGUI_MAIN_H
|
|
@ -1,440 +0,0 @@ |
|||||||
/*
|
|
||||||
vgui_surf.cpp - main vgui layer |
|
||||||
Copyright (C) 2011 Uncle Mike |
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify |
|
||||||
it under the terms of the GNU General Public License as published by |
|
||||||
the Free Software Foundation, either version 3 of the License, or |
|
||||||
(at your option) any later version. |
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, |
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
GNU General Public License for more details. |
|
||||||
|
|
||||||
In addition, as a special exception, the author gives permission |
|
||||||
to link the code of this program with VGUI library developed by |
|
||||||
Valve, L.L.C ("Valve"). You must obey the GNU General Public License |
|
||||||
in all respects for all of the code used other than VGUI library. |
|
||||||
If you modify this file, you may extend this exception to your |
|
||||||
version of the file, but you are not obligated to do so. If |
|
||||||
you do not wish to do so, delete this exception statement |
|
||||||
from your version. |
|
||||||
|
|
||||||
*/ |
|
||||||
|
|
||||||
#include <ctype.h> |
|
||||||
#include "vgui_main.h" |
|
||||||
|
|
||||||
#define MAX_PAINT_STACK 16 |
|
||||||
#define FONT_SIZE 512 |
|
||||||
#define FONT_PAGES 8 |
|
||||||
|
|
||||||
struct FontInfo |
|
||||||
{ |
|
||||||
int id; |
|
||||||
int pageCount; |
|
||||||
int pageForChar[256]; |
|
||||||
int bindIndex[FONT_PAGES]; |
|
||||||
float texCoord[256][FONT_PAGES]; |
|
||||||
int contextCount; |
|
||||||
}; |
|
||||||
|
|
||||||
static int staticContextCount = 0; |
|
||||||
static char staticRGBA[FONT_SIZE * FONT_SIZE * 4]; |
|
||||||
static Font* staticFont = NULL; |
|
||||||
static FontInfo* staticFontInfo; |
|
||||||
static Dar<FontInfo*> staticFontInfoDar; |
|
||||||
static PaintStack paintStack[MAX_PAINT_STACK]; |
|
||||||
static int staticPaintStackPos = 0; |
|
||||||
|
|
||||||
#define ColorIndex( c )((( c ) - '0' ) & 7 ) |
|
||||||
|
|
||||||
CEngineSurface :: CEngineSurface( Panel *embeddedPanel ):SurfaceBase( embeddedPanel ) |
|
||||||
{ |
|
||||||
_embeddedPanel = embeddedPanel; |
|
||||||
_drawColor[0] = _drawColor[1] = _drawColor[2] = _drawColor[3] = 255; |
|
||||||
_drawTextColor[0] = _drawTextColor[1] = _drawTextColor[2] = _drawTextColor[3] = 255; |
|
||||||
|
|
||||||
_surfaceExtents[0] = _surfaceExtents[1] = 0; |
|
||||||
//_surfaceExtents[2] = menu.globals->scrWidth;
|
|
||||||
//_surfaceExtents[3] = menu.globals->scrHeight;
|
|
||||||
embeddedPanel->getSize(_surfaceExtents[2], _surfaceExtents[3]); |
|
||||||
_drawTextPos[0] = _drawTextPos[1] = 0; |
|
||||||
_hCurrentCursor = null; |
|
||||||
|
|
||||||
staticFont = NULL; |
|
||||||
staticFontInfo = NULL; |
|
||||||
staticFontInfoDar.setCount( 0 ); |
|
||||||
staticPaintStackPos = 0; |
|
||||||
staticContextCount++; |
|
||||||
|
|
||||||
_translateX = _translateY = 0; |
|
||||||
} |
|
||||||
|
|
||||||
CEngineSurface :: ~CEngineSurface( void ) |
|
||||||
{ |
|
||||||
g_api->DrawShutdown (); |
|
||||||
} |
|
||||||
|
|
||||||
Panel *CEngineSurface :: getEmbeddedPanel( void ) |
|
||||||
{ |
|
||||||
return _embeddedPanel; |
|
||||||
} |
|
||||||
|
|
||||||
bool CEngineSurface :: hasFocus( void ) |
|
||||||
{ |
|
||||||
// What differs when window does not has focus?
|
|
||||||
//return host.state != HOST_NOFOCUS;
|
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: setCursor( Cursor *cursor ) |
|
||||||
{ |
|
||||||
_currentCursor = cursor; |
|
||||||
|
|
||||||
if( cursor ) |
|
||||||
{ |
|
||||||
g_api->CursorSelect( (VGUI_DefaultCursor)cursor->getDefaultCursor() ); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: SetupPaintState( const PaintStack *paintState ) |
|
||||||
{ |
|
||||||
_translateX = paintState->iTranslateX; |
|
||||||
_translateY = paintState->iTranslateY; |
|
||||||
SetScissorRect( paintState->iScissorLeft, paintState->iScissorTop, |
|
||||||
paintState->iScissorRight, paintState->iScissorBottom ); |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: InitVertex( vpoint_t &vertex, int x, int y, float u, float v ) |
|
||||||
{ |
|
||||||
vertex.point[0] = x + _translateX; |
|
||||||
vertex.point[1] = y + _translateY; |
|
||||||
vertex.coord[0] = u; |
|
||||||
vertex.coord[1] = v; |
|
||||||
} |
|
||||||
|
|
||||||
int CEngineSurface :: createNewTextureID( void ) |
|
||||||
{ |
|
||||||
return g_api->GenerateTexture(); |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawSetColor( int r, int g, int b, int a ) |
|
||||||
{ |
|
||||||
_drawColor[0] = r; |
|
||||||
_drawColor[1] = g; |
|
||||||
_drawColor[2] = b; |
|
||||||
_drawColor[3] = a; |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawSetTextColor( int r, int g, int b, int a ) |
|
||||||
{ |
|
||||||
_drawTextColor[0] = r; |
|
||||||
_drawTextColor[1] = g; |
|
||||||
_drawTextColor[2] = b; |
|
||||||
_drawTextColor[3] = a; |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawFilledRect( int x0, int y0, int x1, int y1 ) |
|
||||||
{ |
|
||||||
vpoint_t rect[2]; |
|
||||||
vpoint_t clippedRect[2]; |
|
||||||
|
|
||||||
if( _drawColor[3] >= 255 ) return; |
|
||||||
|
|
||||||
InitVertex( rect[0], x0, y0, 0, 0 ); |
|
||||||
InitVertex( rect[1], x1, y1, 0, 0 ); |
|
||||||
|
|
||||||
// fully clipped?
|
|
||||||
if( !ClipRect( rect[0], rect[1], &clippedRect[0], &clippedRect[1] )) |
|
||||||
return; |
|
||||||
|
|
||||||
g_api->SetupDrawingRect( _drawColor ); |
|
||||||
g_api->EnableTexture( false ); |
|
||||||
g_api->DrawQuad( &clippedRect[0], &clippedRect[1] ); |
|
||||||
g_api->EnableTexture( true ); |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawOutlinedRect( int x0, int y0, int x1, int y1 ) |
|
||||||
{ |
|
||||||
if( _drawColor[3] >= 255 ) return; |
|
||||||
|
|
||||||
drawFilledRect( x0, y0, x1, y0 + 1 ); // top
|
|
||||||
drawFilledRect( x0, y1 - 1, x1, y1 ); // bottom
|
|
||||||
drawFilledRect( x0, y0 + 1, x0 + 1, y1 - 1 ); // left
|
|
||||||
drawFilledRect( x1 - 1, y0 + 1, x1, y1 - 1 ); // right
|
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawSetTextFont( Font *font ) |
|
||||||
{ |
|
||||||
staticFont = font; |
|
||||||
|
|
||||||
if( font ) |
|
||||||
{ |
|
||||||
bool buildFont = false; |
|
||||||
|
|
||||||
staticFontInfo = NULL; |
|
||||||
|
|
||||||
for( int i = 0; i < staticFontInfoDar.getCount(); i++ ) |
|
||||||
{ |
|
||||||
if( staticFontInfoDar[i]->id == font->getId( )) |
|
||||||
{ |
|
||||||
staticFontInfo = staticFontInfoDar[i]; |
|
||||||
if( staticFontInfo->contextCount != staticContextCount ) |
|
||||||
buildFont = true; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if( !staticFontInfo || buildFont ) |
|
||||||
{ |
|
||||||
staticFontInfo = new FontInfo; |
|
||||||
staticFontInfo->id = 0; |
|
||||||
staticFontInfo->pageCount = 0; |
|
||||||
staticFontInfo->bindIndex[0] = 0; |
|
||||||
staticFontInfo->bindIndex[1] = 0; |
|
||||||
staticFontInfo->bindIndex[2] = 0; |
|
||||||
staticFontInfo->bindIndex[3] = 0; |
|
||||||
memset( staticFontInfo->pageForChar, 0, sizeof( staticFontInfo->pageForChar )); |
|
||||||
staticFontInfo->contextCount = -1; |
|
||||||
staticFontInfo->id = staticFont->getId(); |
|
||||||
staticFontInfoDar.putElement( staticFontInfo ); |
|
||||||
staticFontInfo->contextCount = staticContextCount; |
|
||||||
|
|
||||||
int currentPage = 0; |
|
||||||
int x = 0, y = 0; |
|
||||||
|
|
||||||
memset( staticRGBA, 0, sizeof( staticRGBA )); |
|
||||||
|
|
||||||
for( int i = 0; i < 256; i++ ) |
|
||||||
{ |
|
||||||
int abcA, abcB, abcC; |
|
||||||
staticFont->getCharABCwide( i, abcA, abcB, abcC ); |
|
||||||
|
|
||||||
int wide = abcB; |
|
||||||
|
|
||||||
if( isspace( i )) continue; |
|
||||||
|
|
||||||
int tall = staticFont->getTall(); |
|
||||||
|
|
||||||
if( x + wide + 1 > FONT_SIZE ) |
|
||||||
{ |
|
||||||
x = 0; |
|
||||||
y += tall + 1; |
|
||||||
} |
|
||||||
|
|
||||||
if( y + tall + 1 > FONT_SIZE ) |
|
||||||
{ |
|
||||||
if( !staticFontInfo->bindIndex[currentPage] ) |
|
||||||
staticFontInfo->bindIndex[currentPage] = createNewTextureID(); |
|
||||||
drawSetTextureRGBA( staticFontInfo->bindIndex[currentPage], staticRGBA, FONT_SIZE, FONT_SIZE ); |
|
||||||
currentPage++; |
|
||||||
|
|
||||||
if( currentPage == FONT_PAGES ) |
|
||||||
break; |
|
||||||
|
|
||||||
memset( staticRGBA, 0, sizeof( staticRGBA )); |
|
||||||
x = y = 0; |
|
||||||
} |
|
||||||
|
|
||||||
staticFont->getCharRGBA( i, x, y, FONT_SIZE, FONT_SIZE, (byte *)staticRGBA ); |
|
||||||
staticFontInfo->pageForChar[i] = currentPage; |
|
||||||
staticFontInfo->texCoord[i][0] = (float)((double)x / (double)FONT_SIZE ); |
|
||||||
staticFontInfo->texCoord[i][1] = (float)((double)y / (double)FONT_SIZE ); |
|
||||||
staticFontInfo->texCoord[i][2] = (float)((double)(x + wide)/(double)FONT_SIZE ); |
|
||||||
staticFontInfo->texCoord[i][3] = (float)((double)(y + tall)/(double)FONT_SIZE ); |
|
||||||
x += wide + 1; |
|
||||||
} |
|
||||||
|
|
||||||
if( currentPage != FONT_PAGES ) |
|
||||||
{ |
|
||||||
if( !staticFontInfo->bindIndex[currentPage] ) |
|
||||||
staticFontInfo->bindIndex[currentPage] = createNewTextureID(); |
|
||||||
drawSetTextureRGBA( staticFontInfo->bindIndex[currentPage], staticRGBA, FONT_SIZE, FONT_SIZE ); |
|
||||||
} |
|
||||||
staticFontInfo->pageCount = currentPage + 1; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawSetTextPos( int x, int y ) |
|
||||||
{ |
|
||||||
_drawTextPos[0] = x; |
|
||||||
_drawTextPos[1] = y; |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawPrintChar( int x, int y, int wide, int tall, float s0, float t0, float s1, float t1, int color[4] ) |
|
||||||
{ |
|
||||||
vpoint_t ul, lr; |
|
||||||
|
|
||||||
ul.point[0] = x; |
|
||||||
ul.point[1] = y; |
|
||||||
lr.point[0] = x + wide; |
|
||||||
lr.point[1] = y + tall; |
|
||||||
|
|
||||||
// gets at the texture coords for this character in its texture page
|
|
||||||
ul.coord[0] = s0; |
|
||||||
ul.coord[1] = t0; |
|
||||||
lr.coord[0] = s1; |
|
||||||
lr.coord[1] = t1; |
|
||||||
|
|
||||||
vpoint_t clippedRect[2]; |
|
||||||
|
|
||||||
if( !ClipRect( ul, lr, &clippedRect[0], &clippedRect[1] )) |
|
||||||
return; |
|
||||||
|
|
||||||
g_api->SetupDrawingImage( color ); |
|
||||||
g_api->DrawQuad( &clippedRect[0], &clippedRect[1] ); // draw the letter
|
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawPrintText( const char* text, int textLen ) |
|
||||||
{ |
|
||||||
//return;
|
|
||||||
static bool hasColor = 0; |
|
||||||
static int numColor = 7; |
|
||||||
|
|
||||||
if( !text || !staticFont || _drawTextColor[3] >= 255 ) |
|
||||||
return; |
|
||||||
|
|
||||||
int x = _drawTextPos[0] + _translateX; |
|
||||||
int y = _drawTextPos[1] + _translateY; |
|
||||||
|
|
||||||
int tall = staticFont->getTall(); |
|
||||||
|
|
||||||
int j, iTotalWidth = 0; |
|
||||||
int curTextColor[4]; |
|
||||||
|
|
||||||
// HACKHACK: allow color strings in VGUI
|
|
||||||
if( numColor != 7 ) |
|
||||||
{ |
|
||||||
for( j = 0; j < 3; j++ ) // grab predefined color
|
|
||||||
curTextColor[j] = g_api->GetColor(numColor,j); |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
for( j = 0; j < 3; j++ ) // revert default color
|
|
||||||
curTextColor[j] = _drawTextColor[j]; |
|
||||||
} |
|
||||||
curTextColor[3] = _drawTextColor[3]; // copy alpha
|
|
||||||
|
|
||||||
if( textLen == 1 ) |
|
||||||
{ |
|
||||||
if( *text == '^' ) |
|
||||||
{ |
|
||||||
hasColor = true; |
|
||||||
return; // skip '^'
|
|
||||||
} |
|
||||||
else if( hasColor && isdigit( *text )) |
|
||||||
{ |
|
||||||
numColor = ColorIndex( *text ); |
|
||||||
hasColor = false; // handled
|
|
||||||
return; // skip colornum
|
|
||||||
} |
|
||||||
else hasColor = false; |
|
||||||
} |
|
||||||
for( int i = 0; i < textLen; i++ ) |
|
||||||
{ |
|
||||||
int curCh = g_api->ProcessUtfChar( (unsigned char)text[i] ); |
|
||||||
if( !curCh ) |
|
||||||
{ |
|
||||||
continue; |
|
||||||
} |
|
||||||
|
|
||||||
int abcA, abcB, abcC; |
|
||||||
|
|
||||||
staticFont->getCharABCwide( curCh, abcA, abcB, abcC ); |
|
||||||
|
|
||||||
float s0 = staticFontInfo->texCoord[curCh][0]; |
|
||||||
float t0 = staticFontInfo->texCoord[curCh][1]; |
|
||||||
float s1 = staticFontInfo->texCoord[curCh][2]; |
|
||||||
float t1 = staticFontInfo->texCoord[curCh][3]; |
|
||||||
int wide = abcB; |
|
||||||
|
|
||||||
iTotalWidth += abcA; |
|
||||||
drawSetTexture( staticFontInfo->bindIndex[staticFontInfo->pageForChar[curCh]] ); |
|
||||||
drawPrintChar( x + iTotalWidth, y, wide, tall, s0, t0, s1, t1, curTextColor ); |
|
||||||
iTotalWidth += wide + abcC; |
|
||||||
} |
|
||||||
|
|
||||||
_drawTextPos[0] += iTotalWidth; |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawSetTextureRGBA( int id, const char* rgba, int wide, int tall ) |
|
||||||
{ |
|
||||||
g_api->UploadTexture( id, rgba, wide, tall ); |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawSetTexture( int id ) |
|
||||||
{ |
|
||||||
g_api->BindTexture( id ); |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: drawTexturedRect( int x0, int y0, int x1, int y1 ) |
|
||||||
{ |
|
||||||
vpoint_t rect[2]; |
|
||||||
vpoint_t clippedRect[2]; |
|
||||||
|
|
||||||
InitVertex( rect[0], x0, y0, 0, 0 ); |
|
||||||
InitVertex( rect[1], x1, y1, 1, 1 ); |
|
||||||
|
|
||||||
// fully clipped?
|
|
||||||
if( !ClipRect( rect[0], rect[1], &clippedRect[0], &clippedRect[1] )) |
|
||||||
return; |
|
||||||
|
|
||||||
g_api->SetupDrawingImage( _drawColor ); |
|
||||||
g_api->DrawQuad( &clippedRect[0], &clippedRect[1] ); |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: pushMakeCurrent( Panel* panel, bool useInsets ) |
|
||||||
{ |
|
||||||
int insets[4] = { 0, 0, 0, 0 }; |
|
||||||
int absExtents[4]; |
|
||||||
int clipRect[4]; |
|
||||||
|
|
||||||
if( useInsets ) |
|
||||||
panel->getInset( insets[0], insets[1], insets[2], insets[3] ); |
|
||||||
panel->getAbsExtents( absExtents[0], absExtents[1], absExtents[2], absExtents[3] ); |
|
||||||
panel->getClipRect( clipRect[0], clipRect[1], clipRect[2], clipRect[3] ); |
|
||||||
|
|
||||||
PaintStack *paintState = &paintStack[staticPaintStackPos]; |
|
||||||
|
|
||||||
assert( staticPaintStackPos < MAX_PAINT_STACK ); |
|
||||||
|
|
||||||
paintState->m_pPanel = panel; |
|
||||||
|
|
||||||
// determine corrected top left origin
|
|
||||||
paintState->iTranslateX = insets[0] + absExtents[0]; |
|
||||||
paintState->iTranslateY = insets[1] + absExtents[1]; |
|
||||||
// setup clipping rectangle for scissoring
|
|
||||||
paintState->iScissorLeft = clipRect[0]; |
|
||||||
paintState->iScissorTop = clipRect[1]; |
|
||||||
paintState->iScissorRight = clipRect[2]; |
|
||||||
paintState->iScissorBottom = clipRect[3]; |
|
||||||
|
|
||||||
SetupPaintState( paintState ); |
|
||||||
staticPaintStackPos++; |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: popMakeCurrent( Panel *panel ) |
|
||||||
{ |
|
||||||
int top = staticPaintStackPos - 1; |
|
||||||
|
|
||||||
// more pops that pushes?
|
|
||||||
assert( top >= 0 ); |
|
||||||
|
|
||||||
// didn't pop in reverse order of push?
|
|
||||||
assert( paintStack[top].m_pPanel == panel ); |
|
||||||
|
|
||||||
staticPaintStackPos--; |
|
||||||
|
|
||||||
if( top > 0 ) SetupPaintState( &paintStack[top-1] ); |
|
||||||
} |
|
||||||
|
|
||||||
bool CEngineSurface :: setFullscreenMode( int wide, int tall, int bpp ) |
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
void CEngineSurface :: setWindowedMode( void ) |
|
||||||
{ |
|
||||||
} |
|
@ -1,125 +0,0 @@ |
|||||||
#! /usr/bin/env python |
|
||||||
# encoding: utf-8 |
|
||||||
# mittorn, 2018 |
|
||||||
|
|
||||||
from waflib import Logs |
|
||||||
import os |
|
||||||
|
|
||||||
top = '.' |
|
||||||
|
|
||||||
VGUI_SUPPORTED_OS = ['win32', 'darwin', 'linux'] |
|
||||||
|
|
||||||
def options(opt): |
|
||||||
grp = opt.add_option_group('VGUI options') |
|
||||||
grp.add_option('--vgui', action = 'store', dest = 'VGUI_DEV', default='vgui-dev', |
|
||||||
help = 'path to vgui-dev repo [default: %default]') |
|
||||||
|
|
||||||
grp.add_option('--disable-vgui', action = 'store_true', dest = 'NO_VGUI', default = False, |
|
||||||
help = 'disable vgui_support [default: %default]') |
|
||||||
|
|
||||||
grp.add_option('--skip-vgui-sanity-check', action = 'store_false', dest = 'VGUI_SANITY_CHECK', default=False, |
|
||||||
help = 'skip checking VGUI sanity [default: %default]' ) |
|
||||||
return |
|
||||||
|
|
||||||
def configure(conf): |
|
||||||
conf.env.NO_VGUI = conf.options.NO_VGUI |
|
||||||
if conf.options.NO_VGUI: |
|
||||||
return |
|
||||||
|
|
||||||
conf.start_msg('Does this architecture support VGUI?') |
|
||||||
|
|
||||||
if conf.env.DEST_CPU != 'x86' and not (conf.env.DEST_CPU == 'x86_64' and not conf.options.ALLOW64): |
|
||||||
conf.end_msg('no') |
|
||||||
Logs.warn('vgui is not supported on this CPU: ' + str(conf.env.DEST_CPU)) |
|
||||||
conf.env.NO_VGUI = True |
|
||||||
return |
|
||||||
else: |
|
||||||
conf.end_msg('yes') |
|
||||||
|
|
||||||
conf.start_msg('Does this OS support VGUI?') |
|
||||||
if conf.env.DEST_OS not in VGUI_SUPPORTED_OS: |
|
||||||
conf.end_msg('no') |
|
||||||
Logs.warn('vgui is not supported on this OS: ' + str(conf.env.DEST_OS)) |
|
||||||
conf.env.NO_VGUI = True |
|
||||||
return |
|
||||||
else: |
|
||||||
conf.end_msg('yes') |
|
||||||
|
|
||||||
conf.start_msg('Does this toolchain able to link VGUI?') |
|
||||||
if conf.env.DEST_OS == 'win32' and conf.env.COMPILER_CXX == 'g++': |
|
||||||
conf.end_msg('no') |
|
||||||
# we have ABI incompatibility ONLY on MinGW |
|
||||||
Logs.warn('vgui_support can\'t be built with MinGW') |
|
||||||
conf.env.NO_VGUI = True |
|
||||||
return |
|
||||||
else: |
|
||||||
conf.end_msg('yes') |
|
||||||
|
|
||||||
if conf.env.NO_VGUI: |
|
||||||
return |
|
||||||
|
|
||||||
if conf.options.VGUI_DEV: |
|
||||||
conf.start_msg('Configuring VGUI by provided path') |
|
||||||
conf.env.VGUI_DEV = conf.options.VGUI_DEV |
|
||||||
else: |
|
||||||
conf.start_msg('Configuring VGUI by default path') |
|
||||||
conf.env.VGUI_DEV = 'vgui-dev' |
|
||||||
|
|
||||||
if conf.env.DEST_OS == 'win32': |
|
||||||
conf.env.LIB_VGUI = ['vgui'] |
|
||||||
conf.env.LIBPATH_VGUI = [os.path.abspath(os.path.join(conf.env.VGUI_DEV, 'lib/win32_vc6/'))] |
|
||||||
else: |
|
||||||
libpath = os.path.abspath(os.path.join(conf.env.VGUI_DEV, 'lib')) |
|
||||||
if conf.env.DEST_OS == 'linux': |
|
||||||
conf.env.LIB_VGUI = [':vgui.so'] |
|
||||||
conf.env.LIBPATH_VGUI = [libpath] |
|
||||||
elif conf.env.DEST_OS == 'darwin': |
|
||||||
conf.env.LDFLAGS_VGUI = [os.path.join(libpath, 'vgui.dylib')] |
|
||||||
else: |
|
||||||
conf.fatal('vgui is not supported on this OS: ' + conf.env.DEST_OS) |
|
||||||
conf.env.INCLUDES_VGUI = [os.path.abspath(os.path.join(conf.env.VGUI_DEV, 'include'))] |
|
||||||
|
|
||||||
conf.env.HAVE_VGUI = 1 |
|
||||||
conf.end_msg('yes: {0}, {1}, {2}'.format(conf.env.LIB_VGUI, conf.env.LIBPATH_VGUI, conf.env.INCLUDES_VGUI)) |
|
||||||
|
|
||||||
if conf.env.HAVE_VGUI and conf.options.VGUI_SANITY_CHECK: |
|
||||||
try: |
|
||||||
conf.check_cxx( |
|
||||||
fragment=''' |
|
||||||
#include <VGUI.h> |
|
||||||
int main( int argc, char **argv ) |
|
||||||
{ |
|
||||||
return 0; |
|
||||||
}''', |
|
||||||
msg = 'Checking for library VGUI sanity', |
|
||||||
use = 'VGUI', |
|
||||||
execute = False) |
|
||||||
except conf.errors.ConfigurationError: |
|
||||||
conf.fatal("Can't compile simple program. Check your path to vgui-dev repository.") |
|
||||||
|
|
||||||
def build(bld): |
|
||||||
if bld.env.NO_VGUI: |
|
||||||
return |
|
||||||
|
|
||||||
libs = [] |
|
||||||
|
|
||||||
# basic build: dedicated only, no dependencies |
|
||||||
if bld.env.DEST_OS != 'win32': |
|
||||||
libs += ['DL','M'] |
|
||||||
|
|
||||||
libs.append('VGUI') |
|
||||||
|
|
||||||
source = bld.path.ant_glob(['*.cpp']) |
|
||||||
|
|
||||||
includes = [ '.', '../common', '../engine', '../public' ] |
|
||||||
|
|
||||||
bld.shlib( |
|
||||||
source = source, |
|
||||||
target = 'vgui_support', |
|
||||||
features = 'cxx', |
|
||||||
includes = includes, |
|
||||||
use = libs, |
|
||||||
rpath = '.', |
|
||||||
install_path = bld.env.LIBDIR, |
|
||||||
subsystem = bld.env.MSVC_SUBSYSTEM |
|
||||||
) |
|
Loading…
Reference in new issue