Subversion Repositories Games.Descent

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Portions of this file are copyright Rebirth contributors and licensed as
  3.  * described in COPYING.txt.
  4.  * Portions of this file are copyright Parallax Software and licensed
  5.  * according to the Parallax license below.
  6.  * See COPYING.txt for license details.
  7.  
  8. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  9. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  10. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  11. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  12. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  13. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  14. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  15. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  16. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  17. COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  18. */
  19.  
  20. /*
  21.  *
  22.  * Header for morph.c
  23.  *
  24.  */
  25.  
  26. #pragma once
  27.  
  28. #ifdef __cplusplus
  29. #include <cstdint>
  30. #include "dxxsconf.h"
  31. #include "vecmat.h"
  32. #include "pack.h"
  33. #include "polyobj.h"
  34. #include "dsx-ns.h"
  35.  
  36. #ifdef dsx
  37. #include "compiler-span.h"
  38. #include "fwd-object.h"
  39. #include "physics_info.h"
  40. #include <array>
  41. #include <memory>
  42.  
  43. namespace dcx {
  44.  
  45. struct morph_data : prohibit_void_ptr<morph_data>
  46. {
  47.         using ptr = std::unique_ptr<morph_data>;
  48.         enum
  49.         {
  50.                 MAX_VECS = 5000u,
  51.         };
  52.         struct max_vectors
  53.         {
  54.                 std::size_t count;
  55.                 explicit max_vectors(std::size_t c) : count(c)
  56.                 {
  57.                 }
  58.         };
  59.         struct polymodel_idx
  60.         {
  61.                 std::size_t idx;
  62.                 explicit polymodel_idx(std::size_t i) : idx(i)
  63.                 {
  64.                 }
  65.         };
  66.         static void *operator new(std::size_t bytes) = delete;  /* require caller to use placement-form to specify the number of vectors to allocate */
  67.         static void operator delete(void *p)
  68.         {
  69.                 ::operator delete(p);
  70.         }
  71.         static void operator delete(void *p, max_vectors)
  72.         {
  73.                 ::operator delete(p);
  74.         }
  75.         enum class submodel_state : uint8_t
  76.         {
  77.                 invisible,
  78.                 animating,
  79.                 visible,
  80.         };
  81.         object_base *const obj;                      // object which is morphing
  82.         const object_signature_t Morph_sig;
  83.         uint8_t morph_save_control_type;
  84.         uint8_t morph_save_movement_type;
  85.         uint8_t n_submodels_active;
  86.         std::array<submodel_state, MAX_SUBMODELS> submodel_active;         // which submodels are active
  87.         const max_vectors max_vecs;
  88.         physics_info morph_save_phys_info;
  89.         std::array<int, MAX_SUBMODELS>
  90.                 n_morphing_points,       // how many active points in each part
  91.                 submodel_startpoints;    // first point for each submodel
  92.         static ptr create(object_base &, const polymodel &, polymodel_idx);
  93.         span<fix> get_morph_times();
  94.         span<vms_vector> get_morph_vecs();
  95.         span<vms_vector> get_morph_deltas();
  96. private:
  97.         static void *operator new(std::size_t bytes, max_vectors);
  98.         explicit morph_data(object_base &o, max_vectors);
  99. };
  100.  
  101. struct d_level_unique_morph_object_state;
  102.  
  103. morph_data::ptr *find_morph_data(d_level_unique_morph_object_state &LevelUniqueMorphObjectState, object_base &obj);
  104. }
  105.  
  106. void morph_start(d_level_unique_morph_object_state &, d_level_shared_polygon_model_state &, object_base &obj);
  107.  
  108. //process the morphing object for one frame
  109. void do_morph_frame(object &obj);
  110.  
  111. //called at the start of a level
  112. void init_morphs();
  113. #endif
  114.  
  115. #endif
  116.