/* * Descent 3 * Copyright (C) 2024 Parallax Software * * 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "3d.h" #include "texture.h" #include "object.h" #include "vector.h" #include "hlsoundlib.h" #include "mono.h" #include "d3edit.h" vms_vertex square_data[50] = {-5.0, 5.0, -5, 5.0, 5.0, -5, 5.0, -5.0, -5, -5.0, -5.0, -5, -5.0, 5.0, 5, 5.0, 5.0, 5, 5.0, -5.0, 5, -5.0, -5.0, 5}; g3s_face SquareSides[] = {{4, {0, 1, 2, 3}}, {4, {1, 5, 6, 2}}, {4, {5, 4, 7, 6}}, {4, {4, 0, 3, 7}}, {4, {4, 5, 1, 0}}, {4, {3, 2, 6, 7}}}; g3s_polymodel SquareModel = {6, 8, SquareSides, square_data}; object *Square = NULL; object *Square2 = NULL; extern SoundLib SndLib; void DrawWireframeList(grViewport *vp, g3s_point *p, int nv, ddgr_color color) { g3s_point *p1, *p2; int i; for (i = 0; i < nv; i++) { p1 = &p[i]; p2 = &p[(i + 1) % nv]; vp->line(color, p1->screenx, p1->screeny, p2->screenx, p2->screeny); } } void RenderTexFrame(grViewport *my_viewport) { int nv, i, t; g3s_point phold[70], dhold[70], fhold[70]; g3s_point *plist = phold, *dlist = dhold, *flist = fhold; vms_vector vpos = {0, 0, 0}; vms_orient vang = {0, 0, 0}; static float sx = 0, sy = 0, sz = 15, rl = 0.0; static float xdir = .4; static float ydir = .5; static float zdir = .7; static float ldir = .05; static frame = 0; static time_t oldtime = 0; static int framecount = 0; time_t newtime; static char f_play_sound = 1; framecount++; g3_SetViewAngles(&vpos, &vang, 0); newtime = time(NULL); if (newtime != oldtime) { mprintf_at(1, 2, 0, "%d FPS ", framecount); oldtime = newtime; framecount = 0; } SndLib.begin_sound_frame(); if (Square2 == NULL) { if ((Square2 = AllocateObject()) == NULL) return; mng_LoadAllTextures(); D3EditState.texdlg_texture = 0; } frame++; sx = sx + xdir; sy = sy + ydir; sz = sz + zdir; rl = rl + ldir; if (rl < 0 || rl > 1) { ldir = -ldir; rl = rl + ldir; } if (sx > 10 || sx < -10) { xdir = -xdir; // f_play_sound = 1; } if (sy > 10 || sy < -10) { ydir = -ydir; // f_play_sound = 1; } if (sz > 170 || sz < .000001) { zdir = -zdir; sz += zdir; // f_play_sound = 1; } PositionObject(Square2, sx, sy, sz); if (f_play_sound) { f_play_sound = 0; pos_state cur_pos; cur_pos.position.x = 0; cur_pos.position.y = 0; cur_pos.position.z = 80; SndLib.play_3d_sound(1, cur_pos, OF_LOOPED); } SndLib.update_listener_properties(Square2->cur_pos); g3_BeginFrame(); g3_TransModelToCamera(plist, &SquareModel, Square2); Square2->cur_pos.orientation_angles.heading += GAME_ANGLE * 3; Square2->cur_pos.orientation_angles.pitch += GAME_ANGLE * 2; Current_surface = my_viewport->lock(); for (i = 0; i < SquareModel.num_of_polys; i++) { flist = fhold; dlist = dhold; for (t = 0; t < 4; t++) fhold[t] = plist[SquareModel.faces[i].points[t]]; fhold[0].monolight = fhold[1].monolight = fhold[2].monolight = fhold[3].monolight = rl; fhold[0].ucoord = 0; fhold[0].vcoord = 0; fhold[1].ucoord = 1.0; fhold[1].vcoord = 0; fhold[2].ucoord = 1.0; fhold[2].vcoord = 1.0; fhold[3].ucoord = 0; fhold[3].vcoord = 1.0; fhold[0].flags = fhold[1].flags = fhold[2].flags = fhold[3].flags = PF_TEXTURE | PF_COLORED_LIGHTING | PF_MONO_LIGHTING; nv = g3_CheckToClip(&flist, &dlist, 4); if (sz > 60) tex_SetRenderType(RENDERTYPE_LIN_NON_UNLIT); else tex_SetRenderType(RENDERTYPE_LIN_NON_UNLIT); if (nv > 0) { if (g3_ProjectPointListToCanvas(dlist, nv)) { if (g3_PointsVisible(dlist, nv)) { tex_TriangulatePointList(D3EditState.texdlg_texture, dlist, nv); } } } } my_viewport->unlock(); SndLib.end_sound_frame(); } void RenderWireFrame(grViewport *my_viewport) { int nv = 4; g3s_point phold[10], dhold[10]; g3s_point *plist = phold, *dlist = dhold; static float sx = 0, sy = 0, sz = 20; static float xdir = .4; static float ydir = .3; static float zdir = .6; if (Square == NULL) if ((Square = AllocateObject()) == NULL) return; PositionObject(Square, sx, sy, sz); sx = sx + xdir; sy = sy + ydir; sz = sz + zdir; if (sx > 10 || sx < -10) xdir = -xdir; if (sy > 10 || sy < -10) ydir = -ydir; if (sz > 50 || sz < 5) zdir = -zdir; g3_BeginFrame(); g3_TransVertsToCamera(plist, square_data, Square, 4); nv = g3_CheckToClip(&plist, &dlist, 4); Square->cur_pos.orientation_angles.heading += GAME_ANGLE * 2; Square->cur_pos.orientation_angles.pitch += GAME_ANGLE * 2; if (nv > 0) { g3_ProjectPointListToCanvas(dlist, nv); Current_surface = my_viewport->lock(); DrawWireframeList(my_viewport, dlist, nv, GR_RGB(255, 0, 255)); my_viewport->unlock(); } }