]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/gtkgensurf/plugin.cpp
Merge branch 'fix-fast' into 'master'
[xonotic/netradiant.git] / contrib / gtkgensurf / plugin.cpp
1 /*
2    GenSurf plugin for GtkRadiant
3    Copyright (C) 2001 David Hyde, Loki software and qeradiant.com
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    This library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with this library; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20 #include "gensurf.h"
21
22 // Global plugin FuncTable
23 _QERFuncTable_1 g_FuncTable;
24 _QERQglTable g_GLTable;
25 _QERUIGtkTable g_UIGtkTable;
26 _QEREntityTable __ENTITYTABLENAME;
27 _QERBrushTable __BRUSHTABLENAME;
28 _QERPatchTable __PATCHTABLENAME;
29 bool SingleBrushSelected;
30 bool g_bInitDone;
31
32 #include "iplugin.h"
33
34 const char *QERPlug_Init(void *hApp, void *pMainWidget)
35 {
36     g_pRadiantWnd = (GtkWidget *) pMainWidget;
37
38     return "GenSurf for Q3Radiant";
39 }
40
41 const char *QERPlug_GetName()
42 {
43     return "GtkGenSurf";
44 }
45
46 const char *QERPlug_GetCommandList()
47 {
48     return "Wall facing 270...;Wall facing 180...;Wall facing 90...;Wall facing 0...;"
49             "Ceiling...;Ground surface...;-;About...";
50 }
51
52 // vMin/vMax provide the bounds of the selection, they are zero if there is no selection
53 // if there is a selection, bSingleBrush will be true if a single brush is selected
54 // if so, typical plugin behaviour (such as primitive creation) would use the bounds as
55 // a rule to create the primitive, then delete the selection
56 void QERPlug_Dispatch(const char *p, vec3_t vMin, vec3_t vMax, bool bSingleBrush)
57 {
58     bool Generate = false;
59
60     if (!g_bInitDone) {
61         if (GenSurfInit()) {
62             g_bInitDone = true;
63         }
64     }
65
66     if (!strcmp(p, "Ground surface...")) {
67         SingleBrushSelected = bSingleBrush;
68         Plane = PLANE_XY0;
69         if (SingleBrushSelected) {
70             Hll = vMin[0];
71             Vll = vMin[1];
72             Hur = vMax[0];
73             Vur = vMax[1];
74             Z00 = Z01 = Z10 = Z11 = vMax[2];
75         }
76         Generate = true;
77     } else if (!strcmp(p, "Ceiling...")) {
78         SingleBrushSelected = bSingleBrush;
79         Plane = PLANE_XY1;
80         if (SingleBrushSelected) {
81             Hll = vMin[0];
82             Vll = vMin[1];
83             Hur = vMax[0];
84             Vur = vMax[1];
85             Z00 = Z01 = Z10 = Z11 = vMin[2];
86         }
87         Generate = true;
88     } else if (!strcmp(p, "Wall facing 0...")) {
89         SingleBrushSelected = bSingleBrush;
90         Plane = PLANE_YZ0;
91         if (SingleBrushSelected) {
92             Hll = vMin[1];
93             Vll = vMin[2];
94             Hur = vMax[1];
95             Vur = vMax[2];
96             Z00 = Z01 = Z10 = Z11 = vMax[0];
97         }
98         Generate = true;
99     } else if (!strcmp(p, "Wall facing 90...")) {
100         SingleBrushSelected = bSingleBrush;
101         Plane = PLANE_XZ0;
102         if (SingleBrushSelected) {
103             Hll = vMin[0];
104             Vll = vMin[2];
105             Hur = vMax[0];
106             Vur = vMax[2];
107             Z00 = Z01 = Z10 = Z11 = vMax[1];
108         }
109         Generate = true;
110     } else if (!strcmp(p, "Wall facing 180...")) {
111         SingleBrushSelected = bSingleBrush;
112         Plane = PLANE_YZ1;
113         if (SingleBrushSelected) {
114             Hll = vMin[1];
115             Vll = vMin[2];
116             Hur = vMax[1];
117             Vur = vMax[2];
118             Z00 = Z01 = Z10 = Z11 = vMin[0];
119         }
120         Generate = true;
121     } else if (!strcmp(p, "Wall facing 270...")) {
122         SingleBrushSelected = bSingleBrush;
123         Plane = PLANE_XZ1;
124         if (SingleBrushSelected) {
125             Hll = vMin[0];
126             Vll = vMin[2];
127             Hur = vMax[0];
128             Vur = vMax[2];
129             Z00 = Z01 = Z10 = Z11 = vMin[1];
130         }
131         Generate = true;
132     } else if (!strcmp(p, "About...")) {
133         About(g_pRadiantWnd);
134     }
135
136     if (Generate) {
137         if (SingleBrushSelected) {
138             UseFaceBounds();
139         }
140
141         g_pWnd.show();
142     }
143 }
144
145 // =============================================================================
146 // SYNAPSE
147
148 #include "synapse.h"
149
150 class GenSurfSynapseClient : public CSynapseClient {
151 public:
152 // CSynapseClient API
153     bool RequestAPI(APIDescriptor_t *pAPI);
154
155     const char *GetInfo();
156
157     GenSurfSynapseClient()
158     {}
159
160     virtual ~GenSurfSynapseClient()
161     {}
162 };
163
164 CSynapseServer *g_pSynapseServer = NULL;
165 GenSurfSynapseClient g_SynapseClient;
166
167 extern "C" CSynapseClient *SYNAPSE_DLL_EXPORT
168
169 Synapse_EnumerateInterfaces(const char *version, CSynapseServer *pServer)
170 {
171     if (strcmp(version, SYNAPSE_VERSION)) {
172         Syn_Printf("ERROR: synapse API version mismatch: should be '"
173         SYNAPSE_VERSION
174         "', got '%s'\n", version );
175         return NULL;
176     }
177     g_pSynapseServer = pServer;
178     g_pSynapseServer->IncRef();
179     Set_Syn_Printf(g_pSynapseServer->Get_Syn_Printf());
180
181     g_SynapseClient.AddAPI(PLUGIN_MAJOR, "gtkgensurf", sizeof(_QERPluginTable));
182
183     g_SynapseClient.AddAPI(RADIANT_MAJOR, NULL, sizeof(_QERFuncTable_1), SYN_REQUIRE, &g_FuncTable);
184     g_SynapseClient.AddAPI(UIGTK_MAJOR, NULL, sizeof(_QERUIGtkTable), SYN_REQUIRE, &g_UIGtkTable);
185     g_SynapseClient.AddAPI(QGL_MAJOR, NULL, sizeof(_QERQglTable), SYN_REQUIRE, &g_GLTable);
186     g_SynapseClient.AddAPI(ENTITY_MAJOR, NULL, sizeof(_QEREntityTable), SYN_REQUIRE, &g_EntityTable);
187
188     return &g_SynapseClient;
189 }
190
191 bool GenSurfSynapseClient::RequestAPI(APIDescriptor_t *pAPI)
192 {
193     if (!strcmp(pAPI->major_name, PLUGIN_MAJOR)) {
194         _QERPluginTable *pTable = static_cast<_QERPluginTable *>( pAPI->mpTable );
195
196         pTable->m_pfnQERPlug_Init = QERPlug_Init;
197         pTable->m_pfnQERPlug_GetName = QERPlug_GetName;
198         pTable->m_pfnQERPlug_GetCommandList = QERPlug_GetCommandList;
199         pTable->m_pfnQERPlug_Dispatch = QERPlug_Dispatch;
200         return true;
201     }
202
203     Syn_Printf("ERROR: RequestAPI( '%s' ) not found in '%s'\n", pAPI->major_name, GetInfo());
204     return false;
205 }
206
207 #include "version.h"
208
209 const char *GenSurfSynapseClient::GetInfo()
210 {
211     return "GtkGenSurf - built " __DATE__ " "
212     RADIANT_VERSION;
213 }