809 lines
20 KiB
C++
809 lines
20 KiB
C++
|
// PlugInManager.cpp: implementation of the CPlugInManager class.
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "io.h"
|
||
|
#include "Radiant.h"
|
||
|
#include "PlugInManager.h"
|
||
|
#include "PlugIn.h"
|
||
|
#include "DialogInfo.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[]=__FILE__;
|
||
|
#define new DEBUG_NEW
|
||
|
#endif
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
// Construction/Destruction
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CPlugInManager::CPlugInManager()
|
||
|
{
|
||
|
m_pTexturePlug = NULL;
|
||
|
m_pSurfaceListPlug = NULL;
|
||
|
}
|
||
|
|
||
|
CPlugInManager::~CPlugInManager()
|
||
|
{
|
||
|
Cleanup();
|
||
|
}
|
||
|
|
||
|
void CPlugInManager::Init(const char * pPath)
|
||
|
{
|
||
|
Cleanup();
|
||
|
|
||
|
CString strPath(pPath);
|
||
|
strPath += "*.dll";
|
||
|
|
||
|
bool bGo = true;
|
||
|
|
||
|
struct _finddata_t fileinfo;
|
||
|
int handle = _findfirst (strPath, &fileinfo);
|
||
|
if (handle != -1)
|
||
|
{
|
||
|
do
|
||
|
{
|
||
|
strPath.Format("%s\\%s", pPath, fileinfo.name);
|
||
|
CPlugIn *pPlug = new CPlugIn();
|
||
|
if (pPlug->load(strPath))
|
||
|
{
|
||
|
if(FillFuncTable(pPlug)) // PGM
|
||
|
{
|
||
|
m_PlugIns.Add(pPlug);
|
||
|
g_pParentWnd->AddPlugInMenuItem(pPlug);
|
||
|
|
||
|
// if this thing handles textures
|
||
|
if (pPlug->getTextureInfo() != NULL)
|
||
|
{
|
||
|
this->m_pTexturePlug = pPlug;
|
||
|
|
||
|
// if this is a wad style texture extension, have it load everything now
|
||
|
if (pPlug->getTextureInfo()->m_bWadStyle)
|
||
|
{
|
||
|
CString strPath = ValueForKey(g_qeglobals.d_project_entity, "texturepath");
|
||
|
pPlug->loadTexture(strPath);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (pPlug->getSurfaceFlags() != NULL)
|
||
|
{
|
||
|
this->m_pSurfaceListPlug = pPlug;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
delete pPlug; // PGM
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
delete pPlug;
|
||
|
}
|
||
|
} while (_findnext( handle, &fileinfo ) != -1);
|
||
|
_findclose (handle);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void CPlugInManager::Cleanup()
|
||
|
{
|
||
|
int i;
|
||
|
for (i = 0; i < m_PlugIns.GetSize(); i++)
|
||
|
{
|
||
|
CPlugIn *plug = reinterpret_cast<CPlugIn*>(m_PlugIns.GetAt(i));
|
||
|
plug->free();
|
||
|
delete plug;
|
||
|
}
|
||
|
m_PlugIns.RemoveAll();
|
||
|
|
||
|
for (i = 0; i < m_BrushHandles.GetSize(); i++)
|
||
|
{
|
||
|
brush_t *pb = reinterpret_cast<brush_t*>(m_BrushHandles.GetAt(i));
|
||
|
Brush_Free(pb);
|
||
|
}
|
||
|
m_BrushHandles.RemoveAll();
|
||
|
}
|
||
|
|
||
|
void CPlugInManager::Dispatch(int n, const char * p)
|
||
|
{
|
||
|
for (int i = 0; i < m_PlugIns.GetSize(); i++)
|
||
|
{
|
||
|
CPlugIn *plug = reinterpret_cast<CPlugIn*>(m_PlugIns.GetAt(i));
|
||
|
if (plug->ownsCommandID(n))
|
||
|
{
|
||
|
vec3_t vMin, vMax;
|
||
|
if (selected_brushes.next == &selected_brushes)
|
||
|
{
|
||
|
vMin[0] = vMin[1] = vMin[2] = 0;
|
||
|
VectorCopy(vMin, vMax);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Select_GetBounds (vMin, vMax);
|
||
|
}
|
||
|
plug->dispatchCommand(p, vMin, vMax, QE_SingleBrush(true)); // PGM -- added quiet
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
void WINAPI QERApp_CreateBrush(vec3_t vMin, vec3_t vMax)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
|
||
|
brush_t* pBrush = Brush_Create(vMin, vMax, &g_qeglobals.d_texturewin.texdef);
|
||
|
Entity_LinkBrush (world_entity, pBrush);
|
||
|
Brush_Build(pBrush);
|
||
|
Brush_AddToList (pBrush, &active_brushes);
|
||
|
Select_Brush(pBrush);
|
||
|
Sys_UpdateWindows(W_ALL);
|
||
|
}
|
||
|
|
||
|
|
||
|
LPVOID CPlugInManager::CreateBrushHandle()
|
||
|
{
|
||
|
brush_t *pb = reinterpret_cast<brush_t*>(qmalloc (sizeof(brush_t)));
|
||
|
m_BrushHandles.Add(pb);
|
||
|
return (LPVOID)pb;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CPlugInManager::DeleteBrushHandle(void * vp)
|
||
|
{
|
||
|
CPtrArray* pHandles[3];
|
||
|
pHandles[0] = &m_SelectedBrushHandles;
|
||
|
pHandles[1] = &m_ActiveBrushHandles;
|
||
|
pHandles[2] = &m_BrushHandles;
|
||
|
|
||
|
for (int j = 0; j < 3; j++)
|
||
|
{
|
||
|
for (int i = 0; i < pHandles[j]->GetSize(); i++)
|
||
|
{
|
||
|
brush_t *pb = reinterpret_cast<brush_t*>(pHandles[j]->GetAt(i));
|
||
|
if (pb == reinterpret_cast<brush_t*>(vp))
|
||
|
{
|
||
|
if (j == 2)
|
||
|
{
|
||
|
// only remove it from the list if it is work area
|
||
|
// this allows the selected and active list indexes to remain constant
|
||
|
// throughout a session (i.e. between an allocate and release)
|
||
|
pHandles[j]->RemoveAt(i);
|
||
|
}
|
||
|
Brush_Free(pb);
|
||
|
Sys_MarkMapModified(); // PGM
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CPlugInManager::CommitBrushHandleToMap(void * vp)
|
||
|
{
|
||
|
g_bScreenUpdates = false; //stop the madness
|
||
|
|
||
|
for (int i = 0; i < m_BrushHandles.GetSize(); i++)
|
||
|
{
|
||
|
brush_t *pb = reinterpret_cast<brush_t*>(m_BrushHandles.GetAt(i));
|
||
|
if (pb == reinterpret_cast<brush_t*>(vp))
|
||
|
{
|
||
|
m_BrushHandles.RemoveAt(i);
|
||
|
Entity_LinkBrush (world_entity, pb);
|
||
|
Brush_Build(pb);
|
||
|
Brush_AddToList (pb, &active_brushes);
|
||
|
Select_Brush(pb);
|
||
|
}
|
||
|
}
|
||
|
g_bScreenUpdates = true; //resume the madness
|
||
|
Sys_UpdateWindows(W_ALL);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CPlugInManager::AddFaceToBrushHandle(void * vp, vec3_t v1, vec3_t v2, vec3_t v3)
|
||
|
{
|
||
|
brush_t *bp = FindBrushHandle(vp);
|
||
|
if (bp != NULL)
|
||
|
{
|
||
|
face_t *f = Face_Alloc();
|
||
|
f->texdef = g_qeglobals.d_texturewin.texdef;
|
||
|
f->texdef.flags &= ~SURF_KEEP;
|
||
|
f->texdef.contents &= ~CONTENTS_KEEP;
|
||
|
f->next = bp->brush_faces;
|
||
|
bp->brush_faces = f;
|
||
|
VectorCopy (v1, f->planepts[0]);
|
||
|
VectorCopy (v2, f->planepts[1]);
|
||
|
VectorCopy (v3, f->planepts[2]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
brush_t* CPlugInManager::FindBrushHandle(void * vp)
|
||
|
{
|
||
|
CPtrArray* pHandles[3];
|
||
|
pHandles[0] = &m_SelectedBrushHandles;
|
||
|
pHandles[1] = &m_ActiveBrushHandles;
|
||
|
pHandles[2] = &m_BrushHandles;
|
||
|
|
||
|
for (int j = 0; j < 3; j++)
|
||
|
{
|
||
|
for (int i = 0; i < pHandles[j]->GetSize(); i++)
|
||
|
{
|
||
|
brush_t *pb = reinterpret_cast<brush_t*>(pHandles[j]->GetAt(i));
|
||
|
if (pb == reinterpret_cast<brush_t*>(vp))
|
||
|
{
|
||
|
return pb;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
LPVOID WINAPI QERApp_CreateBrushHandle()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
return g_pParentWnd->GetPlugInMgr().CreateBrushHandle();
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_DeleteBrushHandle(LPVOID vp)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
g_pParentWnd->GetPlugInMgr().DeleteBrushHandle(vp);
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_CommitBrushHandleToMap(LPVOID vp)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
g_pParentWnd->GetPlugInMgr().CommitBrushHandleToMap(vp);
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_AddFace(LPVOID vp, vec3_t v1, vec3_t v2, vec3_t v3)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
g_pParentWnd->GetPlugInMgr().AddFaceToBrushHandle(vp, v1, v2, v3);
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_DeleteSelection()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
Select_Delete();
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_SysMsg(LPCSTR pMsg)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
CString str = pMsg;
|
||
|
Sys_Printf(str.GetBuffer(0));
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_InfoMsg(LPCSTR pMsg)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
ShowInfoDialog(pMsg);
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_HideInfoMsg()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
HideInfoDialog();
|
||
|
}
|
||
|
|
||
|
//=====
|
||
|
//PGM
|
||
|
void WINAPI QERApp_PositionView(vec3_t v1, vec3_t v2)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
g_pParentWnd->ActiveXY()->SetOrigin(v1);
|
||
|
// FIXME - implement this!
|
||
|
Sys_UpdateWindows(W_ALL);
|
||
|
}
|
||
|
//PGM
|
||
|
//=====
|
||
|
|
||
|
//FIXME: this AcquirePath stuff is pretty much a mess and needs cleaned up
|
||
|
bool g_bPlugWait = false;
|
||
|
bool g_bPlugOK = false;
|
||
|
int g_nPlugCount = 0;
|
||
|
|
||
|
void _PlugDone(bool b, int n)
|
||
|
{
|
||
|
g_bPlugWait = false;
|
||
|
g_bPlugOK = b;
|
||
|
g_nPlugCount = n; //++timo added number of entered points
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_GetPoints(int nMax, _QERPointData *pData, LPCSTR pMsg)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
ShowInfoDialog(pMsg);
|
||
|
g_bPlugWait = true;
|
||
|
g_bPlugOK = false;
|
||
|
g_nPlugCount = 0; //++timo replaced by number of points
|
||
|
// g_nPlugCount=nMax-1;
|
||
|
AcquirePath(nMax, &_PlugDone);
|
||
|
while (g_bPlugWait)
|
||
|
{
|
||
|
MSG msg;
|
||
|
if (::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
|
||
|
{
|
||
|
TranslateMessage(&msg);
|
||
|
DispatchMessage(&msg);
|
||
|
}
|
||
|
}
|
||
|
HideInfoDialog();
|
||
|
|
||
|
pData->m_nCount = 0;
|
||
|
pData->m_pVectors = NULL;
|
||
|
|
||
|
if (g_bPlugOK && g_nPlugCount > 0)
|
||
|
{
|
||
|
pData->m_nCount = g_nPlugCount;
|
||
|
pData->m_pVectors = reinterpret_cast<vec3_t*>(qmalloc(g_nPlugCount * sizeof(vec3_t)));
|
||
|
vec3_t *pOut = pData->m_pVectors;
|
||
|
for (int i = 0; i < g_nPlugCount; i++)
|
||
|
{
|
||
|
//++timo
|
||
|
/*
|
||
|
memcpy(pOut, &g_PathPoints[i], sizeof(vec3_t));
|
||
|
pOut += sizeof(vec3_t);
|
||
|
*/
|
||
|
// CClipPoint g_PathPoints[256];
|
||
|
memcpy(pOut, &g_PathPoints[i],sizeof(vec3_t));
|
||
|
pOut++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_AddFaceData(LPVOID pv, _QERFaceData *pData)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
brush_t* pBrush = g_pParentWnd->GetPlugInMgr().FindBrushHandle(pv);
|
||
|
if (pBrush != NULL)
|
||
|
{
|
||
|
face_t *f = Face_Alloc();
|
||
|
f->texdef = g_qeglobals.d_texturewin.texdef;
|
||
|
f->texdef.flags = pData->m_nFlags;
|
||
|
f->texdef.contents = pData->m_nContents;
|
||
|
f->texdef.value = pData->m_nValue;
|
||
|
f->texdef.rotate = pData->m_fRotate;
|
||
|
f->texdef.shift[0] = pData->m_fShift[0];
|
||
|
f->texdef.shift[1] = pData->m_fShift[1];
|
||
|
f->texdef.scale[0] = pData->m_fScale[0];
|
||
|
f->texdef.scale[1] = pData->m_fScale[1];
|
||
|
strcpy(f->texdef.name, pData->m_TextureName);
|
||
|
f->next = pBrush->brush_faces;
|
||
|
pBrush->brush_faces = f;
|
||
|
VectorCopy (pData->m_v1, f->planepts[0]);
|
||
|
VectorCopy (pData->m_v2, f->planepts[1]);
|
||
|
VectorCopy (pData->m_v3, f->planepts[2]);
|
||
|
Sys_MarkMapModified(); // PGM
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int WINAPI QERApp_GetFaceCount(LPVOID pv)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int n = 0;
|
||
|
brush_t *pBrush = g_pParentWnd->GetPlugInMgr().FindBrushHandle(pv);
|
||
|
if (pBrush != NULL)
|
||
|
{
|
||
|
for (face_t *f = pBrush->brush_faces ; f; f = f->next)
|
||
|
{
|
||
|
n++;
|
||
|
}
|
||
|
}
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
_QERFaceData* WINAPI QERApp_GetFaceData(LPVOID pv, int nFaceIndex)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
static _QERFaceData face;
|
||
|
int n = 0;
|
||
|
brush_t *pBrush = g_pParentWnd->GetPlugInMgr().FindBrushHandle(pv);
|
||
|
if (pBrush != NULL)
|
||
|
{
|
||
|
for (face_t *f = pBrush->brush_faces ; f; f = f->next)
|
||
|
{
|
||
|
if (n == nFaceIndex)
|
||
|
{
|
||
|
face.m_nContents = f->texdef.contents;
|
||
|
face.m_nFlags = f->texdef.flags;
|
||
|
face.m_fRotate = f->texdef.rotate;
|
||
|
face.m_fScale[0] = f->texdef.scale[0];
|
||
|
face.m_fScale[1] = f->texdef.scale[1];
|
||
|
face.m_fShift[0] = f->texdef.shift[0];
|
||
|
face.m_fShift[1] = f->texdef.shift[1];
|
||
|
face.m_nValue = f->texdef.value;
|
||
|
strcpy(face.m_TextureName, f->texdef.name);
|
||
|
VectorCopy(f->planepts[0], face.m_v1);
|
||
|
VectorCopy(f->planepts[1], face.m_v2);
|
||
|
VectorCopy(f->planepts[2], face.m_v3);
|
||
|
return &face;
|
||
|
}
|
||
|
n++;
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_SetFaceData(LPVOID pv, int nFaceIndex, _QERFaceData *pData)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int n = 0;
|
||
|
brush_t *pBrush = g_pParentWnd->GetPlugInMgr().FindBrushHandle(pv);
|
||
|
if (pBrush != NULL)
|
||
|
{
|
||
|
for (face_t *f = pBrush->brush_faces ; f; f = f->next)
|
||
|
{
|
||
|
if (n == nFaceIndex)
|
||
|
{
|
||
|
f->texdef.flags = pData->m_nFlags;
|
||
|
f->texdef.contents = pData->m_nContents;
|
||
|
f->texdef.value = pData->m_nValue;
|
||
|
f->texdef.rotate = pData->m_fRotate;
|
||
|
f->texdef.shift[0] = pData->m_fShift[0];
|
||
|
f->texdef.shift[1] = pData->m_fShift[1];
|
||
|
f->texdef.scale[0] = pData->m_fScale[0];
|
||
|
f->texdef.scale[1] = pData->m_fScale[1];
|
||
|
strcpy(f->texdef.name, pData->m_TextureName);
|
||
|
VectorCopy(pData->m_v1, f->planepts[0]);
|
||
|
VectorCopy(pData->m_v2, f->planepts[1]);
|
||
|
VectorCopy(pData->m_v3, f->planepts[2]);
|
||
|
Sys_MarkMapModified(); // PGM
|
||
|
return; // PGM
|
||
|
}
|
||
|
n++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_DeleteFace(LPVOID pv, int nFaceIndex)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int n = 0;
|
||
|
brush_t *pBrush = g_pParentWnd->GetPlugInMgr().FindBrushHandle(pv);
|
||
|
if (pBrush != NULL)
|
||
|
{
|
||
|
face_t *pPrev = pBrush->brush_faces;
|
||
|
for (face_t *f = pBrush->brush_faces; f; f = f->next)
|
||
|
{
|
||
|
if (n == nFaceIndex)
|
||
|
{
|
||
|
pPrev->next = f->next;
|
||
|
Face_Free (f);
|
||
|
Sys_MarkMapModified(); // PGM
|
||
|
return;
|
||
|
}
|
||
|
n++;
|
||
|
pPrev = f;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//==========
|
||
|
//PGM
|
||
|
void WINAPI QERApp_BuildBrush (LPVOID pv)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
brush_t *pBrush = g_pParentWnd->GetPlugInMgr().FindBrushHandle(pv);
|
||
|
if (pBrush != NULL)
|
||
|
{
|
||
|
Brush_Build(pBrush);
|
||
|
Sys_UpdateWindows(W_ALL);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_SelectBrush (LPVOID pv)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
brush_t *pBrush = g_pParentWnd->GetPlugInMgr().FindBrushHandle(pv);
|
||
|
if (pBrush != NULL)
|
||
|
{
|
||
|
Select_Brush(pBrush, false);
|
||
|
Sys_UpdateWindows(W_ALL);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_DeselectBrush (LPVOID pv)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
// FIXME - implement this!
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_ResetPlugins()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
g_pParentWnd->OnPluginsRefresh();
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_DeselectAllBrushes ()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
Select_Deselect();
|
||
|
Sys_UpdateWindows(W_ALL);
|
||
|
}
|
||
|
//PGM
|
||
|
//==========
|
||
|
|
||
|
void WINAPI QERApp_TextureBrush(LPVOID pv, LPCSTR pName)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
brush_t *pBrush = g_pParentWnd->GetPlugInMgr().FindBrushHandle(pv);
|
||
|
if (pBrush != NULL)
|
||
|
{
|
||
|
for (face_t *f = pBrush->brush_faces ; f; f = f->next)
|
||
|
{
|
||
|
strcpy(f->texdef.name, pName);
|
||
|
}
|
||
|
Sys_MarkMapModified(); // PGM
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int WINAPI QERApp_SelectedBrushCount()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int n = 0;
|
||
|
for (brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next)
|
||
|
{
|
||
|
n++;
|
||
|
}
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
int WINAPI QERApp_ActiveBrushCount()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int n = 0;
|
||
|
for (brush_t *pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next)
|
||
|
{
|
||
|
n++;
|
||
|
}
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
int WINAPI QERApp_AllocateSelectedBrushHandles()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int n = 0;
|
||
|
for (brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next)
|
||
|
{
|
||
|
n++;
|
||
|
g_pParentWnd->GetPlugInMgr().GetSelectedHandles().Add(pb);
|
||
|
}
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
int WINAPI QERApp_AllocateActiveBrushHandles()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int n = 0;
|
||
|
for (brush_t *pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next)
|
||
|
{
|
||
|
n++;
|
||
|
g_pParentWnd->GetPlugInMgr().GetActiveHandles().Add(pb);
|
||
|
}
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_ReleaseSelectedBrushHandles()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
g_pParentWnd->GetPlugInMgr().GetSelectedHandles().RemoveAll();
|
||
|
Sys_UpdateWindows(W_ALL);
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_ReleaseActiveBrushHandles()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
g_pParentWnd->GetPlugInMgr().GetActiveHandles().RemoveAll();
|
||
|
Sys_UpdateWindows(W_ALL);
|
||
|
}
|
||
|
|
||
|
LPVOID WINAPI QERApp_GetActiveBrushHandle(int nIndex)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
if (nIndex < g_pParentWnd->GetPlugInMgr().GetActiveHandles().GetSize())
|
||
|
{
|
||
|
return reinterpret_cast<LPVOID>(g_pParentWnd->GetPlugInMgr().GetActiveHandles().GetAt(nIndex));
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
LPVOID WINAPI QERApp_GetSelectedBrushHandle(int nIndex)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
if (nIndex < g_pParentWnd->GetPlugInMgr().GetSelectedHandles().GetSize())
|
||
|
{
|
||
|
return reinterpret_cast<LPVOID>(g_pParentWnd->GetPlugInMgr().GetSelectedHandles().GetAt(nIndex));
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
int WINAPI QERApp_TextureCount()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
Texture_StartPos ();
|
||
|
int x, y;
|
||
|
int n = 0;
|
||
|
while (1)
|
||
|
{
|
||
|
qtexture_t *q = Texture_NextPos (&x, &y);
|
||
|
if (!q)
|
||
|
break;
|
||
|
n++;
|
||
|
}
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
LPCSTR WINAPI QERApp_GetTexture(int nIndex)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
static char name[QER_MAX_NAMELEN];
|
||
|
Texture_StartPos ();
|
||
|
int x, y;
|
||
|
int n = 0;
|
||
|
while (1)
|
||
|
{
|
||
|
qtexture_t *q = Texture_NextPos (&x, &y);
|
||
|
if (!q)
|
||
|
break;
|
||
|
if (n == nIndex)
|
||
|
{
|
||
|
strcpy(name, q->name);
|
||
|
return name;
|
||
|
}
|
||
|
n++;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
LPCSTR WINAPI QERApp_GetCurrentTexture()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
return g_qeglobals.d_texturewin.texdef.name;
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_SetCurrentTexture(LPCSTR strName)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
texdef_t tex;
|
||
|
strcpy(tex.name, strName);
|
||
|
Texture_SetTexture(&tex);
|
||
|
}
|
||
|
|
||
|
int WINAPI QERApp_GetEClassCount()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int n = 0;
|
||
|
for (eclass_t *e = eclass ; e ; e = e->next)
|
||
|
{
|
||
|
n++;
|
||
|
}
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
LPCSTR WINAPI QERApp_GetEClass(int nIndex)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int n = 0;
|
||
|
for (eclass_t *e = eclass ; e ; e = e->next)
|
||
|
{
|
||
|
if (n == nIndex)
|
||
|
{
|
||
|
return e->name;
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void WINAPI QERApp_LoadTextureRGBA(LPVOID vp)
|
||
|
{
|
||
|
Texture_LoadFromPlugIn(vp);
|
||
|
}
|
||
|
|
||
|
|
||
|
_QERTextureInfo* CPlugInManager::GetTextureInfo()
|
||
|
{
|
||
|
if (m_pTexturePlug != NULL)
|
||
|
{
|
||
|
return m_pTexturePlug->getTextureInfo();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LPVOID CPlugInManager::GetSurfaceFlags()
|
||
|
{
|
||
|
if (m_pSurfaceListPlug != NULL)
|
||
|
{
|
||
|
return m_pSurfaceListPlug->getSurfaceFlags();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
extern qtexture_t *g_pluginTexture;
|
||
|
|
||
|
void CPlugInManager::LoadTexture(const char *pFilename)
|
||
|
{
|
||
|
g_pluginTexture = NULL;
|
||
|
if (m_pTexturePlug != NULL)
|
||
|
{
|
||
|
m_pTexturePlug->loadTexture(pFilename);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
int CPlugInManager::FillFuncTable(CPlugIn *pPlug)
|
||
|
{
|
||
|
_QERFuncTable_1 *pTable = reinterpret_cast<_QERFuncTable_1*>(pPlug->getFuncTable());
|
||
|
if (pTable != NULL)
|
||
|
{
|
||
|
if (pTable->m_fVersion != QER_PLUG_VERSION)
|
||
|
{
|
||
|
Sys_Printf("Radiant plugin manager was built with version %.2f, Plugin %s is version %.2f\n", QER_PLUG_VERSION, pPlug->getVersionStr(), pTable->m_fVersion);
|
||
|
}
|
||
|
if (pTable->m_fVersion >= QER_PLUG_VERSION_1)
|
||
|
{
|
||
|
pTable->m_pfnCreateBrush = &QERApp_CreateBrush;
|
||
|
pTable->m_pfnCreateBrushHandle = &QERApp_CreateBrushHandle;
|
||
|
pTable->m_pfnDeleteBrushHandle = &QERApp_DeleteBrushHandle;
|
||
|
pTable->m_pfnCommitBrushHandle = &QERApp_CommitBrushHandleToMap;
|
||
|
pTable->m_pfnAddFace = &QERApp_AddFace;
|
||
|
pTable->m_pfnAddFaceData = &QERApp_AddFaceData;
|
||
|
pTable->m_pfnGetFaceData = &QERApp_GetFaceData;
|
||
|
pTable->m_pfnGetFaceCount = &QERApp_GetFaceCount;
|
||
|
pTable->m_pfnSetFaceData = &QERApp_SetFaceData;
|
||
|
pTable->m_pfnDeleteFace = &QERApp_DeleteFace;
|
||
|
pTable->m_pfnTextureBrush = &QERApp_TextureBrush;
|
||
|
pTable->m_pfnBuildBrush = &QERApp_BuildBrush; // PGM
|
||
|
pTable->m_pfnSelectBrush = &QERApp_SelectBrush; // PGM
|
||
|
pTable->m_pfnDeselectBrush = &QERApp_DeselectBrush; // PGM
|
||
|
pTable->m_pfnDeselectAllBrushes = &QERApp_DeselectAllBrushes; // PGM
|
||
|
pTable->m_pfnDeleteSelection = &QERApp_DeleteSelection;
|
||
|
pTable->m_pfnGetPoints = &QERApp_GetPoints;
|
||
|
pTable->m_pfnSysMsg = &QERApp_SysMsg;
|
||
|
pTable->m_pfnInfoMsg = &QERApp_InfoMsg;
|
||
|
pTable->m_pfnHideInfoMsg = &QERApp_HideInfoMsg;
|
||
|
pTable->m_pfnPositionView = &QERApp_PositionView; // PGM
|
||
|
pTable->m_pfnSelectedBrushCount = &QERApp_SelectedBrushCount;
|
||
|
pTable->m_pfnAllocateSelectedBrushHandles = &QERApp_AllocateSelectedBrushHandles;
|
||
|
pTable->m_pfnReleaseSelectedBrushHandles = &QERApp_ReleaseSelectedBrushHandles;
|
||
|
pTable->m_pfnGetSelectedBrushHandle = &QERApp_GetSelectedBrushHandle;
|
||
|
pTable->m_pfnActiveBrushCount = &QERApp_ActiveBrushCount;
|
||
|
pTable->m_pfnAllocateActiveBrushHandles = &QERApp_AllocateActiveBrushHandles;
|
||
|
pTable->m_pfnReleaseActiveBrushHandles = &QERApp_ReleaseActiveBrushHandles;
|
||
|
pTable->m_pfnGetActiveBrushHandle = &QERApp_GetActiveBrushHandle;
|
||
|
pTable->m_pfnTextureCount = &QERApp_TextureCount;
|
||
|
pTable->m_pfnGetTexture = &QERApp_GetTexture;
|
||
|
pTable->m_pfnGetCurrentTexture = &QERApp_GetCurrentTexture;
|
||
|
pTable->m_pfnSetCurrentTexture = &QERApp_SetCurrentTexture;
|
||
|
pTable->m_pfnGetEClassCount = &QERApp_GetEClassCount;
|
||
|
pTable->m_pfnGetEClass = &QERApp_GetEClass;
|
||
|
pTable->m_pfnResetPlugins = &QERApp_ResetPlugins;
|
||
|
}
|
||
|
// end of v1.00
|
||
|
if (pTable->m_fVersion >= QER_PLUG_VERSION)
|
||
|
{
|
||
|
// v1.50 starts
|
||
|
pTable->m_pfnLoadTextureRGBA = &QERApp_LoadTextureRGBA;
|
||
|
// end of v1.50
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Sys_Printf("Unable to load %s because the function tables are not the same size\n", pPlug->getVersionStr());
|
||
|
}
|
||
|
return false;
|
||
|
}
|