123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- /*
- ===========================================================================
- Doom 3 GPL Source Code
- Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
- This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
- Doom 3 Source Code 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.
- Doom 3 Source Code 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.
- You should have received a copy of the GNU General Public License
- along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
- In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
- If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
- ===========================================================================
- */
- #include "../../idlib/precompiled.h"
- #pragma hdrstop
- #include "qe3.h"
- #define PAGEFLIPS 2
- z_t z;
- /*
- =======================================================================================================================
- Z_Init
- =======================================================================================================================
- */
- void Z_Init(void) {
- z.origin[0] = 0;
- z.origin[1] = 20;
- z.origin[2] = 46;
- z.scale = 1;
- }
- /* MOUSE ACTIONS */
- static int cursorx, cursory;
- /*
- =======================================================================================================================
- Z_MouseDown
- =======================================================================================================================
- */
- void Z_MouseDown(int x, int y, int buttons) {
- idVec3 org, dir, vup, vright;
- brush_t *b;
- Sys_GetCursorPos(&cursorx, &cursory);
- vup[0] = 0;
- vup[1] = 0;
- vup[2] = 1 / z.scale;
- VectorCopy(z.origin, org);
- org[2] += (y - (z.height / 2)) / z.scale;
- org[1] = MIN_WORLD_COORD;
- b = selected_brushes.next;
- if (b != &selected_brushes) {
- org[0] = (b->mins[0] + b->maxs[0]) / 2;
- }
- dir[0] = 0;
- dir[1] = 1;
- dir[2] = 0;
- vright[0] = 0;
- vright[1] = 0;
- vright[2] = 0;
- // new mouse code for ZClip, I'll do this stuff before falling through into the standard ZWindow mouse code...
- //
- if (g_pParentWnd->GetZWnd()->m_pZClip) // should always be the case I think, but this is safer
- {
- bool bToggle = false;
- bool bSetTop = false;
- bool bSetBot = false;
- bool bReset = false;
- if (g_PrefsDlg.m_nMouseButtons == 2)
- {
- // 2 button mice...
- //
- bToggle = (GetKeyState(VK_F1) & 0x8000) != 0;
- bSetTop = (GetKeyState(VK_F2) & 0x8000) != 0;
- bSetBot = (GetKeyState(VK_F3) & 0x8000) != 0;
- bReset = (GetKeyState(VK_F4) & 0x8000) != 0;
- }
- else
- {
- // 3 button mice...
- //
- bToggle = (buttons == (MK_RBUTTON|MK_SHIFT|MK_CONTROL));
- bSetTop = (buttons == (MK_RBUTTON|MK_SHIFT));
- bSetBot = (buttons == (MK_RBUTTON|MK_CONTROL));
- bReset = (GetKeyState(VK_F4) & 0x8000) != 0;
- }
-
- if (bToggle)
- {
- g_pParentWnd->GetZWnd()->m_pZClip->Enable(!(g_pParentWnd->GetZWnd()->m_pZClip->IsEnabled()));
- Sys_UpdateWindows (W_ALL);
- return;
- }
- if (bSetTop)
- {
- g_pParentWnd->GetZWnd()->m_pZClip->SetTop(org[2]);
- Sys_UpdateWindows (W_ALL);
- return;
- }
-
- if (bSetBot)
- {
- g_pParentWnd->GetZWnd()->m_pZClip->SetBottom(org[2]);
- Sys_UpdateWindows (W_ALL);
- return;
- }
- if (bReset)
- {
- g_pParentWnd->GetZWnd()->m_pZClip->Reset();
- Sys_UpdateWindows (W_ALL);
- return;
- }
- }
- //
- // LBUTTON = manipulate selection shift-LBUTTON = select middle button = grab
- // texture ctrl-middle button = set entire brush to texture ctrl-shift-middle
- // button = set single face to texture
- //
- // see code above for these next 3, I just commented them here as well for clarity...
- //
- // ctrl-shift-RIGHT button = toggle ZClip on/off
- // shift-RIGHT button = set ZClip top marker
- // ctrl-RIGHT button = set ZClip bottom marker
- int nMouseButton = g_PrefsDlg.m_nMouseButtons == 2 ? MK_RBUTTON : MK_MBUTTON;
- if
- (
- (buttons == MK_LBUTTON) ||
- (buttons == (MK_LBUTTON | MK_SHIFT)) ||
- (buttons == MK_MBUTTON) // || (buttons == (MK_MBUTTON|MK_CONTROL))
- ||
- (buttons == (nMouseButton | MK_SHIFT | MK_CONTROL))
- ) {
- Drag_Begin(x, y, buttons, vright, vup, org, dir);
- return;
- }
- // control mbutton = move camera
- if ((buttons == (MK_CONTROL | nMouseButton)) || (buttons == (MK_CONTROL | MK_LBUTTON))) {
- g_pParentWnd->GetCamera()->Camera().origin[2] = org[2];
- Sys_UpdateWindows(W_CAMERA | W_XY_OVERLAY | W_Z);
- }
- }
- /*
- =======================================================================================================================
- Z_MouseUp
- =======================================================================================================================
- */
- void Z_MouseUp(int x, int y, int buttons) {
- Drag_MouseUp();
- }
- /*
- =======================================================================================================================
- Z_MouseMoved
- =======================================================================================================================
- */
- void Z_MouseMoved(int x, int y, int buttons) {
- if (!buttons) {
- return;
- }
- if (buttons == MK_LBUTTON) {
- Drag_MouseMoved(x, y, buttons);
- Sys_UpdateWindows(W_Z | W_CAMERA_IFON | W_XY);
- return;
- }
- // rbutton = drag z origin
- if (buttons == MK_RBUTTON) {
- Sys_GetCursorPos(&x, &y);
- if (y != cursory) {
- z.origin[2] += y - cursory;
- Sys_SetCursorPos(cursorx, cursory);
- Sys_UpdateWindows(W_Z);
- }
- return;
- }
- // control mbutton = move camera
- int nMouseButton = g_PrefsDlg.m_nMouseButtons == 2 ? MK_RBUTTON : MK_MBUTTON;
- if ((buttons == (MK_CONTROL | nMouseButton)) || (buttons == (MK_CONTROL | MK_LBUTTON))) {
- g_pParentWnd->GetCamera()->Camera().origin[2] = z.origin[2] + (y - (z.height / 2)) / z.scale;
- Sys_UpdateWindows(W_CAMERA | W_XY_OVERLAY | W_Z);
- }
- }
- /*
- =======================================================================================================================
- DRAWING £
- Z_DrawGrid
- =======================================================================================================================
- */
- void Z_DrawGrid(void) {
- float zz, zb, ze;
- int w, h;
- char text[32];
- w = z.width / 2 / z.scale;
- h = z.height / 2 / z.scale;
- zb = z.origin[2] - h;
- if (zb < region_mins[2]) {
- zb = region_mins[2];
- }
- zb = 64 * floor(zb / 64);
- ze = z.origin[2] + h;
- if (ze > region_maxs[2]) {
- ze = region_maxs[2];
- }
- ze = 64 * ceil(ze / 64);
- // draw major blocks
- qglColor3fv( g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR].ToFloatPtr() );
- qglBegin(GL_LINES);
- qglVertex2f(0, zb);
- qglVertex2f(0, ze);
- for (zz = zb; zz < ze; zz += 64) {
- qglVertex2f(-w, zz);
- qglVertex2f(w, zz);
- }
- qglEnd();
- // draw minor blocks
- if ( g_qeglobals.d_showgrid &&
- g_qeglobals.d_gridsize * z.scale >= 4 &&
- !g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR].Compare( g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK] ) ) {
- qglColor3fv(g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR].ToFloatPtr());
- qglBegin(GL_LINES);
- for (zz = zb; zz < ze; zz += g_qeglobals.d_gridsize) {
- if (!((int)zz & 63)) {
- continue;
- }
- qglVertex2f(-w, zz);
- qglVertex2f(w, zz);
- }
- qglEnd();
- }
- // draw coordinate text if needed
- qglColor3fv(g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT].ToFloatPtr());
- for (zz = zb; zz < ze; zz += 64) {
- qglRasterPos2f(-w + 1, zz);
- sprintf(text, "%i", (int)zz);
- qglCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
- }
- }
- #define CAM_HEIGHT 48 // height of main part
- #define CAM_GIZMO 8 // height of the gizmo
- /*
- =======================================================================================================================
- =======================================================================================================================
- */
- void ZDrawCameraIcon(void) {
- float x, y;
- int xCam = z.width / 4;
- x = 0;
- y = g_pParentWnd->GetCamera()->Camera().origin[2];
- qglColor3f(0.0, 0.0, 1.0);
- qglBegin(GL_LINE_STRIP);
- qglVertex3f(x - xCam, y, 0);
- qglVertex3f(x, y + CAM_GIZMO, 0);
- qglVertex3f(x + xCam, y, 0);
- qglVertex3f(x, y - CAM_GIZMO, 0);
- qglVertex3f(x - xCam, y, 0);
- qglVertex3f(x + xCam, y, 0);
- qglVertex3f(x + xCam, y - CAM_HEIGHT, 0);
- qglVertex3f(x - xCam, y - CAM_HEIGHT, 0);
- qglVertex3f(x - xCam, y, 0);
- qglEnd();
- }
- void ZDrawZClip()
- {
- float x,y;
-
- x = 0;
- y = g_pParentWnd->GetCamera()->Camera().origin[2];
- if (g_pParentWnd->GetZWnd()->m_pZClip) // should always be the case I think
- g_pParentWnd->GetZWnd()->m_pZClip->Paint();
- }
- GLbitfield glbitClear = GL_COLOR_BUFFER_BIT; // HACK
- /*
- =======================================================================================================================
- Z_Draw
- =======================================================================================================================
- */
- void Z_Draw(void) {
- brush_t *brush;
- float w, h;
- float top, bottom;
- idVec3 org_top, org_bottom, dir_up, dir_down;
- int xCam = z.width / 3;
- if (!active_brushes.next) {
- return; // not valid yet
- }
- // clear
- qglViewport(0, 0, z.width, z.height);
- qglScissor(0, 0, z.width, z.height);
- qglClearColor
- (
- g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][0],
- g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][1],
- g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][2],
- 0
- );
- /*
- * GL Bug £
- * When not using hw acceleration, gl will fault if we clear the depth buffer bit
- * on the first pass. The hack fix is to set the GL_DEPTH_BUFFER_BIT only after
- * Z_Draw() has been called once. Yeah, right. £
- * qglClear(glbitClear);
- */
- qglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- //
- // glbitClear |= GL_DEPTH_BUFFER_BIT;
- // qglClear(GL_DEPTH_BUFFER_BIT);
- //
- qglMatrixMode(GL_PROJECTION);
- qglLoadIdentity();
- w = z.width / 2 / z.scale;
- h = z.height / 2 / z.scale;
- qglOrtho(-w, w, z.origin[2] - h, z.origin[2] + h, -8, 8);
- globalImages->BindNull();
- qglDisable(GL_DEPTH_TEST);
- qglDisable(GL_BLEND);
- // now draw the grid
- Z_DrawGrid();
- // draw stuff
- qglDisable(GL_CULL_FACE);
- qglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- globalImages->BindNull();
- // draw filled interiors and edges
- dir_up[0] = 0;
- dir_up[1] = 0;
- dir_up[2] = 1;
- dir_down[0] = 0;
- dir_down[1] = 0;
- dir_down[2] = -1;
- VectorCopy(z.origin, org_top);
- org_top[2] = 4096;
- VectorCopy(z.origin, org_bottom);
- org_bottom[2] = -4096;
- for (brush = active_brushes.next; brush != &active_brushes; brush = brush->next) {
- if
- (
- brush->mins[0] >= z.origin[0] ||
- brush->maxs[0] <= z.origin[0] ||
- brush->mins[1] >= z.origin[1] ||
- brush->maxs[1] <= z.origin[1]
- ) {
- continue;
- }
- if (!Brush_Ray(org_top, dir_down, brush, &top)) {
- continue;
- }
- top = org_top[2] - top;
- if (!Brush_Ray(org_bottom, dir_up, brush, &bottom)) {
- continue;
- }
- bottom = org_bottom[2] + bottom;
- //q = declManager->FindMaterial(brush->brush_faces->texdef.name);
- qglColor3f(brush->owner->eclass->color.x, brush->owner->eclass->color.y, brush->owner->eclass->color.z);
- qglBegin(GL_QUADS);
- qglVertex2f(-xCam, bottom);
- qglVertex2f(xCam, bottom);
- qglVertex2f(xCam, top);
- qglVertex2f(-xCam, top);
- qglEnd();
- qglColor3f(1, 1, 1);
- qglBegin(GL_LINE_LOOP);
- qglVertex2f(-xCam, bottom);
- qglVertex2f(xCam, bottom);
- qglVertex2f(xCam, top);
- qglVertex2f(-xCam, top);
- qglEnd();
- }
- // now draw selected brushes
- for (brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next) {
- if
- (
- !(
- brush->mins[0] >= z.origin[0] ||
- brush->maxs[0] <= z.origin[0] ||
- brush->mins[1] >= z.origin[1] ||
- brush->maxs[1] <= z.origin[1]
- )
- ) {
- if (Brush_Ray(org_top, dir_down, brush, &top)) {
- top = org_top[2] - top;
- if (Brush_Ray(org_bottom, dir_up, brush, &bottom)) {
- bottom = org_bottom[2] + bottom;
- //q = declManager->FindMaterial(brush->brush_faces->texdef.name);
- qglColor3f(brush->owner->eclass->color.x, brush->owner->eclass->color.y, brush->owner->eclass->color.z);
- qglBegin(GL_QUADS);
- qglVertex2f(-xCam, bottom);
- qglVertex2f(xCam, bottom);
- qglVertex2f(xCam, top);
- qglVertex2f(-xCam, top);
- qglEnd();
- }
- }
- }
- qglColor3fv(g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES].ToFloatPtr());
- qglBegin(GL_LINE_LOOP);
- qglVertex2f(-xCam, brush->mins[2]);
- qglVertex2f(xCam, brush->mins[2]);
- qglVertex2f(xCam, brush->maxs[2]);
- qglVertex2f(-xCam, brush->maxs[2]);
- qglEnd();
- }
- ZDrawCameraIcon();
- ZDrawZClip();
- qglFinish();
- QE_CheckOpenGLForErrors();
- }
|