/* Copyright (C) 2015-2018 Night Dive Studios, LLC. 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 . */ /* * $Header: n:/project/lib/src/edms/RCS/edms_int.h 1.4 1993/05/13 15:46:06 roadkill Exp $ */ // This header file contains the codes for the object types and functions in Soliton. // ===================================================================== #ifndef __EDMS_INT_H #define __EDMS_INT_H // Are we building a shipping version? // =================================== //#define EDMS_SHIPPABLE 1 // Things like Getch() // ------------------- ////#include //#pragma INLINE_DEPTH 255 //#pragma INLINE_RECURSION ON // Cool math universe... // --------------------- #include "fixpp.h" // Physics handle typedef // ====================== #include "physhand.h" #include "ss_flet.h" // Actual object types... // ====================== extern Q VACUUM, MARBLE, ROBOT, FIELD_POINT, BIPED, PELVIS, DEATH, D_FRAME; // Commands for soliton from the state stream (in the Global.cc file)... // ===================================================================== extern Q END; // Max and Minima... // ================= #define MAX_OBJ 96 //#define DOF_MAX 96 #define DOF_MAX 40 #define EDMS_DATA_SIZE 100 #define DOF 7 // degrees of freedom #define DOF_DERIVS 4 // d/dt each dof this-1 times // Dan, these are model specific, so we need more general names than below. I suggest //#define DOF_X 0 //#define DOF_Y 1 //#define DOF_Z 2 //#define DOF_ORIENT_0 3 //#define DOF_ORIENT_1 4 //#define DOF_ORIENT_2 5 //#define DOF_ORIENT_3 6 // But I can't spend time right now changing the references in your code ;^) ... #define DOF_X 0 #define DOF_Y 1 #define DOF_Z 2 #define DOF_ALPHA 3 #define DOF_BETA 4 #define DOF_GAMMA 5 #define DOF_DIRAC 6 // Memory conserving stuff... // ========================== typedef Q EDMS_Argument_Block[MAX_OBJ][DOF][DOF_DERIVS]; typedef Q (*EDMS_Argblock_Pointer)[DOF][DOF_DERIVS]; // Have some functions... // ====================== // General functions... // -------------------- typedef struct { fix playfield_size; int32_t min_physics_handle; void (*collision_callback)(physics_handle caller, physics_handle victim, int32_t badness, int32_t DATA1, int32_t DATA2, fix location[3]), (*autodestruct_callback)(physics_handle caller), (*awol_callback)(physics_handle caller), (*snooz_callback)(physics_handle caller); void *argblock_pointer; } EDMS_data; // Structs... // ========== typedef struct { fix X, Y, Z, alpha, beta, gamma; fix X_dot, Y_dot, Z_dot, alpha_dot, beta_dot, gamma_dot; } State; // Stuff that used to be in physhand.h.... // ======================================= typedef int32_t object_number; #define physics_handle_to_object_number(ph) (ph2on[ph]) #define object_number_to_physics_handle(on) (on2ph[on]) extern "C" { void EDMS_init_handles(void); physics_handle EDMS_bind_object_number(object_number on); void EDMS_remap_object_number(object_number old, object_number nu); physics_handle EDMS_get_free_ph(void); void EDMS_release_object(physics_handle ph); } // Terrain // ======= Q terrain(Q X, Q Y, int32_t deriv); // This calls Terrain() TerrainHit indoor_terrain(Q X, Q Y, Q Z, Q R, physics_handle ph, TFType type); // Indoor for Citadel, FBO, etc... extern "C" { fix Terrain(fix X, fix Y, int32_t deriv); // This is provided by the user... TerrainHit Indoor_Terrain(fix X, fix Y, fix Z, fix R, physics_handle ph, TFType type); // As is this... // Here's the actual indoor guy we ask for... // ------------------------------------------ typedef struct { // Filled by user when Indoor_Terrain is called... fix cx, cy, cz; fix fx, fy, fz; fix wx, wy, wz; } TerrainData; extern TerrainData terrain_info; // Struct name EDMS expects... // Freefall terrain data structures... // ----------------------------------- typedef struct { // The ground... fix g_height, g_dx, g_dy, g_dz; // Any walls... fix w_x, w_y, w_z; // Squishiness, friction, et cetera... fix terrain_information; // For terrain return information... int32_t DATA1, DATA2; // Only needed for "fast" terrain calls fix my_size; // Who's responsible... physics_handle caller; } terrain_ff; bool FF_terrain(fix X, fix Y, fix Z, uchar fast, terrain_ff *TFF); // From Freefall... bool FF_raycast(fix x, fix y, fix z, fix *vec, fix range, fix *where_hit, terrain_ff *tff); } bool ff_terrain(Q X, Q Y, Q Z, uchar fast, terrain_ff *TFF); // For the refined... bool ff_raycast(Q x, Q y, Q z, Fixpoint *vec, Q range, Fixpoint *where_hit, terrain_ff *FFT); // Motion package functions... // =========================== // Marble... // --------- void marble_X(int32_t object); void marble_Y(int32_t object); void marble_Z(int32_t object); // Robot... // -------- void robot_X(int32_t object); void robot_Y(int32_t object); void robot_Z(int32_t object); // Deformable objects... // --------------------- void field_point_X(int32_t object); void field_point_Y(int32_t object); void field_point_Z(int32_t object); // Have some arrays... // =================== // binary database (collision) operators... // ======================================== // Playfield information and scaling... // ------------------------------------ //#define COLLISION_SIZE 100 #define DELTA_BY_TWO .5 #define NUM_OBJECT_BITS 32 #define object_bit(n) (1 << (n & 31)) // To turn on an element... // ------------------------ #define write_object_bit(X, Y, obit) (data[X][Y] |= obit) // Turn it off... // -------------- #define delete_object_bit(X, Y, obit) (data[X][Y] &= ~(obit)) // Test a bit... // ------------- #define test_object_bit(X, Y, object) (data[X][Y] & object_bit(object)) // Check for a given collision... // ------------------------------ #define check_object(caller, looker) \ (data[(hash_scale * A[caller][DOF_X][0]).to_int()][(hash_scale * A[caller][DOF_Y][0]).to_int()] & \ object_bit(looker)) // This used to be a function in collide.cc // I had to change the name because Seamus had some files locked out. #define check_for_hit(other_object) (test_bitmask & object_bit(other_object)) // Ta Daa. // ======= #include "externs.h" #endif // __EDMS_INT_H