groupdlg.cpp
来自「quake3工具源码。包括生成bsp文件」· C++ 代码 · 共 635 行 · 第 1/2 页
CPP
635 行
// GroupDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Radiant.h"
#include "GroupDlg.h"
#include "NameDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IMG_PATCH 0
#define IMG_BRUSH 1
#define IMG_GROUP 2
#define IMG_ENTITY 3
#define IMG_ENTITYGROUP 4
#define IMG_MODEL 5
#define IMG_SCRIPT 6
// misc group support
#define MAX_GROUPS 4096
#define GROUP_DELIMETER '@'
#define GROUPNAME "QER_Group_%i"
CGroupDlg g_wndGroup;
CGroupDlg *g_pGroupDlg = &g_wndGroup;
// group_t are loaded / saved through "group_info" entities
// they hold epairs for group settings and additionnal access info (tree nodes)
group_t *g_pGroups = NULL;
void Group_Add(entity_t *e)
{
group_t *g = (group_t*)qmalloc(sizeof(group_t));
g->epairs = e->epairs;
g->next = NULL;
e->epairs = NULL;
// create a new group node
HTREEITEM hItem = g_wndGroup.m_wndTree.GetSelectedItem();
TVINSERTSTRUCT tvInsert;
memset(&tvInsert, 0, sizeof(TVINSERTSTRUCT));
tvInsert.item.iImage = IMG_GROUP;
tvInsert.item.iSelectedImage = tvInsert.item.iImage;
//++timo wasat?
// tvInsert.hParent = (hItem) ? hItem : m_hWorld;
tvInsert.hParent = g_wndGroup.m_hWorld;
tvInsert.hInsertAfter = NULL;
tvInsert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
char *pipo = ValueForKey(e->epairs, "group");
tvInsert.item.pszText = _T(ValueForKey(g->epairs, "group"));
g->itemOwner = g_wndGroup.m_wndTree.InsertItem(&tvInsert);
g->next = g_pGroups;
g_pGroups = g;
}
group_t* Group_Alloc(char *name)
{
group_t *g = (group_t*)qmalloc(sizeof(group_t));
SetKeyValue( g->epairs, "group", name );
return g;
}
group_t* Group_ForName(const char * name)
{
group_t *g = g_pGroups;
while (g != NULL)
{
if (strcmp( ValueForKey(g->epairs,"group"), name ) == 0)
break;
g = g->next;
}
return g;
}
void Group_AddToItem(brush_t *b, HTREEITEM item)
{
char cBuff[1024];
int nImage = IMG_BRUSH;
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
const char *pName = NULL;
const char *pNamed = Brush_GetKeyValue(b, "name");
if (!b->owner || (b->owner == world_entity))
{
if (b->patchBrush)
{
pName = "Generic Patch";
nImage = IMG_PATCH;
}
else
{
pName = "Generic Brush";
nImage = IMG_BRUSH;
}
}
else
{
pName = b->owner->eclass->name;
if (b->owner->eclass->fixedsize)
{
nImage = IMG_ENTITY;
}
else
{
nImage = IMG_ENTITYGROUP;
}
}
strcpy(cBuff, pName);
TVINSERTSTRUCT tvInsert;
memset(&tvInsert, 0, sizeof(TVINSERTSTRUCT));
tvInsert.item.iImage = (b->patchBrush) ? IMG_PATCH : IMG_BRUSH;
tvInsert.item.iSelectedImage = tvInsert.item.iImage;
tvInsert.hParent = item;
tvInsert.hInsertAfter = NULL;
tvInsert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvInsert.item.pszText = cBuff;
HTREEITEM itemNew = g_pGroupDlg->m_wndTree.InsertItem(&tvInsert);
g_pGroupDlg->m_wndTree.SetItemData(itemNew, reinterpret_cast<DWORD>(b));
b->itemOwner = itemNew;
g_pGroupDlg->m_wndTree.RedrawWindow();
}
void Group_RemoveBrush(brush_t *b)
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
if (b->itemOwner)
{
g_pGroupDlg->m_wndTree.DeleteItem(b->itemOwner);
b->itemOwner = NULL;
g_pGroupDlg->m_wndTree.RedrawWindow();
}
DeleteKey(b->epairs, "group");
}
void Group_AddToWorld(brush_t *b)
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
HTREEITEM itemParent = g_pGroupDlg->m_wndTree.GetRootItem();
Group_AddToItem(b, itemParent);
}
void Group_AddToProperGroup(brush_t *b)
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
// NOTE: we do a local copy of the "group" key because it gets erased by Group_RemoveBrush
const char *pGroup = Brush_GetKeyValue(b, "group");
// remove the entry in the tree if there's one
if (b->itemOwner)
{
g_pGroupDlg->m_wndTree.DeleteItem(b->itemOwner);
b->itemOwner = NULL;
g_pGroupDlg->m_wndTree.RedrawWindow();
}
if (*pGroup != 0)
{
// find the item
group_t *g = Group_ForName(pGroup);
if (g)
Group_AddToItem(b, g->itemOwner);
#ifdef _DEBUG
else
Sys_Printf("WARNING: unexpected Group_ForName not found in Group_AddToProperGroup\n");
#endif
}
else
{
Group_AddToWorld(b);
}
}
void Group_AddToSelected(brush_t *b)
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
HTREEITEM hItem = g_pGroupDlg->m_wndTree.GetSelectedItem();
if (hItem == NULL)
{
hItem = g_pGroupDlg->m_wndTree.GetRootItem();
}
Group_AddToItem(b, hItem);
}
void Group_Save(FILE *f)
{
group_t *g = g_pGroups;
while (g)
{
fprintf(f,"{\n\"classname\" \"group_info\"\n\"group\" \"%s\"\n}\n", ValueForKey( g->epairs, "group" ));
g = g->next;
}
}
void Group_Init()
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
// start by cleaning everything
// clean the groups
//++timo FIXME: we leak, delete the groups on the way (I don't have time to do it now)
#ifdef _DEBUG
Sys_Printf("TODO: fix leak in Group_Init\n");
#endif
group_t *g = g_pGroups;
while (g)
{
epair_t *ep,*enext;
for (ep = g->epairs ; ep ; ep=enext )
{
enext = ep->next;
free (ep->key);
free (ep->value);
free (ep);
}
g = g->next;
}
g_pGroups = NULL;
g_wndGroup.m_wndTree.DeleteAllItems();
TVINSERTSTRUCT tvInsert;
memset(&tvInsert, 0, sizeof(TVINSERTSTRUCT));
tvInsert.hParent = NULL;
tvInsert.hInsertAfter = NULL;
tvInsert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvInsert.item.pszText = _T("World");
tvInsert.item.iImage = IMG_GROUP;
tvInsert.item.iSelectedImage = IMG_GROUP;
HTREEITEM hWorld = g_wndGroup.m_wndTree.InsertItem(&tvInsert);
// walk through all the brushes, remove the itemOwner key and add them back where they belong
brush_t *b;
for (b = active_brushes.next; b != &active_brushes; b = b->next)
{
b->itemOwner = NULL;
Group_AddToProperGroup(b);
}
for (b = selected_brushes.next ; b != &selected_brushes ; b = b->next)
{
b->itemOwner = NULL;
Group_AddToProperGroup(b);
}
}
// scan through world_entity for groups in this map?
// we use GROUPNAME "QER_group_%i" to look for existing groups and their naming
//++timo FIXME: is this actually needed for anything?
void Group_GetListFromWorld(CStringArray *pArray)
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
if (world_entity == NULL)
{
return;
}
pArray->RemoveAll();
char cBuff[1024];
for (int i =0; i < MAX_GROUPS; i++)
{
sprintf(cBuff, GROUPNAME, i);
char *pGroup = ValueForKey(world_entity, cBuff);
if (pGroup && strlen(pGroup) > 0)
{
pArray->Add(pGroup);
}
else
{
break;
}
}
}
void Group_RemoveListFromWorld()
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
CStringArray array;
Group_GetListFromWorld(&array);
int nCount = array.GetSize();
for (int i = 0; i < nCount; i++)
{
DeleteKey(world_entity, array.GetAt(i));
}
}
/*
void Group_SetListToWorld(CStringArray *pArray)
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
char cBuff[1024];
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?