/* * 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 . */ #ifndef HEMICUBE_H #define HEMICUBE_H #include "3d.h" #include "radiosity.h" #include "gr.h" typedef struct { matrix view_matrix; matrix head_matrix; vector view_position; rad_element *shooting_element; rad_surface *shooting_surface; grHardwareSurface drawing_surface; grViewport *vport; int *id_grid; float *depth_grid; float *top_array; float *side_array; int ff_res; // Form factor resolution int grid_dim; // Hemicube top/side array dimension } rad_hemicube; typedef struct { float sx,sy; float z; } hemicube_point; extern rad_hemicube rad_Hemicube; extern int Hemicube_resolution; // Calculates the form factors for a hemicube void CalculateFormFactorsHemiCube (); // Initializes the hemicube void InitHemicube (int resolution); void CloseHemicube (); // Clears the Zbuffer hemicube grid void ClearHemicubeGrid (); // Sets the elements we're shooting from void SetElementView(rad_element *ep); // Sets the surface we're shooting from void SetSurfaceView(rad_surface *ep); // Build transformation matrix for our hemicube void BuildTransform(vector *nu,vector *nv,vector *nn); // Gets our view system ready for drawing void StartHemicubeDrawing (); // Releases the view system void EndHemicubeDrawing (int); // Update hemicube view transformation matrix void UpdateView( int face_id ); // Actually draws the projected polygon onto a hemicube face void ScanRadiosityPoly (g3Point **pl,int nv,int element_id); void DrawRadiosityPoly(int nv,g3Point **pointlist,int id); void GetVertexOrdering (hemicube_point *t, int nv, int *vlt, int *vlb, int *vrt, int *vrb,int *bottom_y_ind); int PrevIndex(int val,int modulus); int NextIndex(int val,int modulus); // Sums the delta form factors void SumDeltas (float *ff_array,int face_id); float GetTopFactor( int row, int col ); // Get side face cell form factor float GetSideFactor( int row, int col ); #endif