HUtility.h
1 // Copyright (c) Tech Soft 3D, Inc.
2 //
3 // The information contained herein is confidential and proprietary to Tech Soft 3D, Inc.,
4 // and considered a trade secret as defined under civil and criminal statutes.
5 // Tech Soft 3D, Inc. shall pursue its civil and criminal remedies in the event of
6 // unauthorized use or misappropriation of its trade secrets. Use of this information
7 // by anyone other than authorized employees of Tech Soft 3D, Inc. is granted only under
8 // a written non-disclosure agreement, expressly prescribing the scope and manner of such use.
9 
10 // HUtility.h : interface of the HUtility class
11 // Set of utility methods
12 // All methods are public and static
13 
14 
15 #ifndef _HUTILITY_H
16 #define _HUTILITY_H
17 
18 #ifdef H_PACK_8
19 #pragma pack(push)
20 #pragma pack(8)
21 #endif
22 
23 
24 #include "HTools.h"
25 #include "hic_types.h"
26 
27 class HBaseView;
29 class HSmartSelItem;
30 class HBaseModel;
31 
32 class HShellObject;
33 
34 
35 enum AbsoluteWindowType
36 {
37  RelativeLeft,
38  RelativeRight,
39  RelativeTop,
40  RelativeBottom,
41  NotRelative
42 };
43 
45 {
46 public:
48  {
49  nindex = -1;
50  tcindex = -1;
51  nextindex = -1;
52  }
53  int nindex;
54  int nextindex;
55  int tcindex;
56 };
57 
58 
59 class MVO_API ShellToRegionMapper
60 {
61 public:
63  void AddRegion(HC_KEY originalshell, HC_KEY newshell, int regionnum, bool check = true);
64  HC_KEY GetOriginalShell(HC_KEY newshell, int regionnum);
65  int GetRegionsFromOriginalShell(HC_KEY originalshell, HC_KEY **newshells, int &regionnum);
66  void BuildSegmentTreeRecursive(HC_KEY okey, HC_KEY nkey);
67  void MapSegmentTree(HC_KEY modelkey);
68  void AddSegmentMapping(HC_KEY originalshell, HC_KEY segmentkey);
69 
70  struct vhash_s * m_RegionToShellHash;
71  struct vhash_s * m_ShellToRegionHash;
72  struct vhash_s * m_ShellToSegmentHash;
73 
74 };
75 
76 
77 
78 
79 
81 
84 class MVO_API HShellEdge {
85 public:
90  HShellEdge(int iFirst = 0, int iSecond = 0){
91  Set(iFirst, iSecond);
92  };
94  int GetFirst() const { return m_iFirst; };
96  int GetSecond() const { return m_iSecond; };
101  void Set(int first, int second) {
102  /* first should always be < second to eliminate ambiguity. */
103  if(first < second){
104  m_iFirst = first;
105  m_iSecond = second;
106  } else {
107  m_iFirst = second;
108  m_iSecond = first;
109  }
110  };
111 
112  bool operator<(HShellEdge const & rhs) const {
113  if(m_iFirst != rhs.m_iFirst)
114  return m_iFirst < rhs.m_iFirst;
115  return m_iSecond < rhs.m_iSecond;
116  }
117 
118 private:
119  int m_iFirst;
120  int m_iSecond;
121 };
122 
124 
127 class MVO_API HShellFace{
128 public:
133  HShellFace(HShellObject const * pShell, int const iFaceIndex);
134 
136  int GetPointCount() const ;
137 
139  int GetEdgeCount() const ;
144  HShellEdge const GetEdge(int const iEdgeIndex) const;
148  void OpenEdge(int const iEdgeIndex) const;
152  void CloseEdge() const;
153 
154 private:
155  HShellObject const * m_pShell;
156  int m_iFaceIndex;
157  int m_iPointCount;
158 };
159 
161 
164 class MVO_API HShellRegion{
165 public:
170  HShellRegion(HShellObject const * pShell, int const iRegionIndex);
171  ~HShellRegion(){
172  delete [] m_pRegionFlist;
173  }
176  int GetFaceCount() const;
181  HShellFace const GetFace(int index) const;
182 
183  //void Open() const;
184  //void Close() const;
185 private:
186  HShellObject const * m_pShell;
187  int m_iRegionIndex;
188 
189  int m_iRegionFlistLength;
190  int *m_pRegionFlist;
191 };
192 
193 
195 
198 class MVO_API HShellObject {
199 public:
203  HShellObject(HC_KEY kShellKey);
204  HShellObject(HShellObject const & oShellObj);
205  ~HShellObject();
206 
211  HShellRegion const GetRegion(int const index) const;
212 
214  int GetFaceCount() const;
219  int GetFaceFlistIndex(int index) const;
220 
221  //void Open() const;
222  //void Close() const;
223 
225  HC_KEY GetKey() const ;
227  int GetFlistLen() const ;
229  int const * GetFlist() const ;
232  void GetFlist (int flist[]) const;
233 
234 private:
235  int m_iFlistLen;
236  int * m_pFlist;
237  mutable int * m_pFaceIndexes;
238 
239  HC_KEY m_kShellKey;
240 };
241 
242 
244 
247 class MVO_API HShell {
248 public:
249  HShell()
250  :point_list_len(0),
251  point_list(),
252  normal_list(),
253  face_list_len(0),
254  face_list(0),
255  face_count(0),
256  region_count(0),
257  region_list(0)
258  {}
259  ~HShell()
260  {
261  /* No need to check for null pointers. delete already does that. */
262  delete [] point_list;
263  delete [] normal_list;
264  delete [] face_list;
265  delete [] region_list;
266  }
270 
272  int *face_list;
274 
276  int *region_list;
277 };
278 
280 
284 class MVO_API HShellWrapper {
285 
286 public:
291  HShellWrapper(HC_KEY key) {
292  m_Points = 0;
293  m_Flist = 0;
294  m_VParams = 0;
295  m_VNormals = 0;
296  m_VColors = 0;
297  m_faceregion = 0;
298  m_totalnumfaceslen = 0;
299  m_numfaceslen = 0;
300  m_FNArray = 0;
301  m_faceindirect = 0;
302  Set(key);
303  }
308  m_Key = INVALID_KEY;
309  m_Points = 0;
310  m_Flist = 0;
311  m_VParams = 0;
312  m_VNormals = 0;
313  m_VColors = 0;
314  m_flen = 0;
315  m_plen = 0;
316  m_totalplen = 0;
317  m_totalflen = 0;
318  m_faceregion = 0;
319  m_totalnumfaceslen = 0;
320  m_numfaceslen = 0;
321  m_FNArray = 0;
322  m_faceindirect = 0;
323  }
324  ~HShellWrapper();
325 
336  HC_KEY Insert(int plen, HPoint points[], int flen, int flist[], HC_KEY insertkey = INVALID_KEY);
344  HC_KEY Show(int *plen, HPoint **points, int *flen, int **flist);
348  HC_KEY GetKey() { return m_Key; }
352  void TransformPoints(float matrix[]);
353 
358  HC_KEY Optimize(char *options);
364  HC_KEY Optimize2(char *options);
365 
366  void MakePolygon(int facelen, int face[], HPoint points[]);
367 
368 
371  void OpenOwnerSegment();
372 
375  void BeginFaceIteration();
376 
379  void EndFaceIteration() { ; };
380  int GetFace(int facenum, int **face);
385  int NextFace(int **face);
386 
392  void CalculateFaceCenter(int face[], int flen, HPoint *mid);
399  void AddPoints(HPoint points[], int pnum, HPoint param[] = 0, HPoint normals[] = 0, bool AddImmediately= false);
406  void AddFace(int face[], int fnum, int regionnum, HPoint points[], HPoint normals[] = 0, bool AddImediately= false);
413  void AddFaceDirect(int face[], int fnum, bool reverse = false, bool AddImmediatly= false);
420  void AddFace(HPoint points[], int fnum, bool AddImmediatly= false);
425  void Set(HC_KEY key);
432  void Regenerate(HC_KEY newowner = INVALID_KEY, bool makeSegment = true, bool regenerate = false);
437  void GrowArrays(int fnum);
443  void GrowPointArray(int fnum, bool gorwvparams = false, bool grownormals = false);
444 
445  void GrowPointArray2(int fnum, bool growparamarray = false, bool grownormalarray = false, bool growfnarray = false, bool growcolorarray = false);
446  void AddNextFaceWithDistinctNormals(HPoint const * points, HPoint const * normals, int const * face1, int const * face2, int fnum);
447  void AddNextFaceWithDistinctNormalsAndTexture(HPoint const * points, HPoint const * normals, HPoint const * texcor,int const * face1, int const *face2, int const *face3, int fnum);
448  void AddNextFaceWithDistinctNormalsAndColor(HPoint const *points, HPoint const *normals,int const *face1, int const *face2, HPoint *face3, int fnum);
449 
450 
451  void BeginAddFaces(int pnum);
452  void EndAddFaces();
453 
458  void GrowFaceArray(int fnum);
459 
461  void SubdivideOneQuadFace(int face[], HShellWrapper &wrapper, bool generateIsolines, int *facecolorlist, int &fclnum);
462 
464  void SubdivideOneQuadFace2(int face[]);
469  void SubdivideQuadFaces(bool GenerateIsolines);
470 
474  void SetVertexColors(HPoint *color);
478  void ShowVertexColors(HPoint *color);
483  void SetVertexColors(float *findex);
487  void ShowVertexColors(float *color);
493  void MakeLod(int lodnum, int percent);
499  void FindExtents(HPoint &center, HPoint &min, HPoint &max);
500  void ReplaceWithParameters(int plen, HPoint points[], int flen, int flist[], HPoint normals[] = 0, float params[] = 0, int paranum = 3, HPoint vcolors[] = 0, bool emptyshell = false);
501  void ReplaceWithParameters(int plen, HPoint points[], int flen, int flist[], HPoint normals[], float params[], int paranum, bool emptyshell);
502  void Replace(int plen, HPoint points[], int flen, int flist[], HPoint normals[] = 0, bool emptyshell = false);
503 
504  void SetFaceRegion(int regionnum);
505 
506  void SetEmptyShell(HC_KEY segmentkey, bool MakeSegment);
507 
508 
509  int m_plen;
510  int m_flen;
511  HPoint *m_Points;//<! The list of pointst that define the shell.
512  HPoint *m_VParams;
513  HPoint *m_VColors;
514  HPoint *m_VNormals;
515  int *m_Flist;
517 
524  int m_totalnumfaceslen;
525  int m_numfaceslen;
526  int *m_faceregion;
527  int *m_faceindirect;
528  FaceWithNormalInfo *m_FNArray;
529 
530 };
531 
532 
534 
537 class MVO_API HCamera {
538 public:
539  bool valid;
543  float field_width;
544  float field_height;
545  char projection[128];
546 
547  HCamera () {
548  projection[0] = '\0';
549  valid = false;
550  }
551 
553  inline void InvalidateCamera() { projection[0]='\0'; valid = false; }
554 
558  bool CameraDifferent(HCamera &cam);
559 
563  bool CameraDifferentByAngle(HCamera &cam);
564 
565 
568  void GetFromView(HBaseView * view);
569 
571  void Show() {
572  HC_Show_Camera (&position, &target, &up_vector, &field_width, &field_height, projection);
573  valid = true;
574  };
575 
577  void Set() const {
578  HC_Set_Camera (&position, &target, &up_vector, field_width, field_height, projection);
579  };
580 };
581 
582 
584 
587 class MVO_API HBSurfVertex
588 {
589 public:
590  double x;
591  double y;
592  double z;
593  double w;
594 
597  inline void Set(double X, double Y, double Z, double W) { x=X, y=Y, z=Z, w=W; }
598 };
599 
601 
605 class MVO_API HPolyline
606 {
607 public:
611 };
612 
614 
618 class MVO_API HShellVertexData
619 {
620 public:
621  /* Constructor initializes this object to an invalid state. */
622  HShellVertexData():m_VertexCount(0), m_pFIndexArraySize(0), m_pFIndexArray(0), m_Key(INVALID_KEY){
623  m_sType[0] = '\0';
624  }
625 
626  /* Destructor free up the resources this object is using. */
627  ~HShellVertexData(){
628  ResetMyself();
629  }
630 
631  /* Sets the key and fills in the members with the correct data for this shell. */
632  void SetKey(HC_KEY const key);
633 
634  /* Return a const string for the type of shell. */
635  char const * const GetType() const {
636  return m_sType;
637  }
638 
639  /* Returns the vertex count for this shell. */
640  int const GetVertexCount() const {
641  return m_VertexCount;
642  }
643 
644  /* Return the key for the shell */
645  HC_KEY const GetKey() const {
646  return m_Key;
647  }
648 
649  /* Return the size the findex array */
650  int const GetFIndexDataSize() const {
651  return m_pFIndexArraySize;
652  }
653 
654  /* Returns a const array for the findex values in this shell. */
655  float const * const GetFIndexData() const {
656  return m_pFIndexArray;
657  }
658 
659  /* Returns a const array (as an argument) for the findex values in this shell.
660  Note that the array must be of the appropriate size, e.g., via a call to GetFIndexDataSize. */
661  void GetFIndexData(float data[]) const;
662 
663  void SetFIndexData(int const size, float const data[]);
664 
665 private:
666  void ResetMyself();
667 
668  int m_VertexCount;
669  int m_pFIndexArraySize;
670  float *m_pFIndexArray;
671  HC_KEY m_Key;
672  char m_sType[32];
673 };
674 
675 
677 
679 typedef struct
680 {
682  int len;
684 
685 
686 enum HWindowCorner
687 {
688  TopLeft,
689  BottomLeft,
690  BottomRight,
691  TopRight
692 };
693 
694 
695 
696 
697 
698 
699 
701 
719 class MVO_API HUserOptions
720 {
721 public:
722 
723  char * m_data;
724  int m_length;
725  bool m_valid;
726 
728  HUserOptions();
729 
731  HUserOptions(const HUserOptions& in_data);
732 
733 
735  ~HUserOptions();
736 
737 
741  bool IsValid();
742 
748  const char * Show_User_Options();
749 
755  const char * Show_One_Net_User_Option(const char * which);
756 
762  const char * Show_One_User_Option(const char * which);
763 
769  const char * Show_Net_User_Options();
770 
771 
772 private:
773 
774  void clear() {
775  delete [] m_data;
776  m_data = 0;
777  m_length = 0;
778  };
779 
780 };
781 
782 
783 
785 
788 class MVO_API HUtility
789 {
790 public:
791 #undef PI
792  static const float PI;
793 
794  enum{X, Y, Z, W};
795  enum{XY, XZ, YZ};
796 
797  static const float EH_Epsilon;
798 
799 
806  static void Order(HPoint* one, HPoint* two);
807 
814  static void Find_Relative_Path(HC_KEY from_seg_key, HC_KEY to_seg_key, char * path);
815 
819  static float GetTime();
820 
821 
826  static void ClampPointToWindow (HPoint * point);
827 
834  static HC_KEY InsertBox (HPoint const * max, HPoint const * min);
835 
843  static HC_KEY InsertWireframeBox (HPoint * max, HPoint * min);
844 
851  static void GenerateCuboidPoints (HPoint const * max, HPoint const * min, HPoint * points);
852 
864  static HC_KEY InsertRectangle (const char * seg, float x0, float y0, float x1, float y1, float z = 0.0f, bool fill = false);
865 
866 
881  static void InsertArrow(float stick_length, float tip_length, float stick_radius, float arrow_radius, const char *text, const char *stick_color, const char *tip_color, int num_sides = 6, float tip_falloff = 0.05, bool reverse = true);
882 
889  static void ComputeDoublePrecisionCrossProduct(double * vector1, double * vector2, double * up);
890 
897  static double ComputeDoublePrecisionDotProduct(double * vector1, double * vector2);
898 
904  static double ComputeDoublePrecisionVectorLength(double * vector1);
905 
912  static void GetViewplaneVectors(HC_KEY segment_key, double * view, double * up);
913 
918  static void NormalizeDoublePrecisionVector(double* vector1);
919 
927  static bool PointsEqual(HPoint * point1, HPoint * point2);
928 
940  static bool CreateAxisCircle (HPoint const & center, float radius, int axis, bool convert = true);
941 
942 
949  static void RotateToVector(HPoint start, HPoint end, bool doTranslation = true);
950 
966  static void SmoothTransition(const HPoint &co, const HPoint &to, const HPoint &uo, float fieldwidtho, float fieldheighto, const HPoint &cn, const HPoint &tn, const HPoint &un, float fieldwidthn, float fieldheightn, HBaseView *view);
967 
975  static void SmoothTransition(HCamera old_camera, const HCamera &new_camera, HBaseView *view);
976 
983  static bool CamerasEqual(const HCamera &camera1, const HCamera &camera2);
984 
992  static void ComputeVectorToVectorRotationMatrix(float matrix[],HPoint v1,HPoint v2);
993 
1002  static bool ExtractRGB(char *text,float &r, float &g, float &b);
1003 
1014  static void TransitionQuaternion(float quat_old[], float quat_new[], float t, float qt[]);
1015 
1021  static void MatrixToQuaternion(float matrix[], float quaternion[]);
1022 
1028  static void QuaternionToMatrix(float quaternion[], float matrix[]);
1029 
1038  static void SmoothQuaternionTransition(HBaseView *m_pView, char *old_seg, char *new_seg, int num_of_transitions);
1039 
1047  static void SmoothMatrixTransition(HBaseView *m_pView, HC_KEY seg_key, float new_matrix[]);
1048 
1058  static void MultiSmoothTransitions(HBaseView *m_pView, int num_keys, HC_KEY *seg_key, float new_matrix[], HCamera *new_camera = 0);
1059 
1065  static HPoint GetCentroid(HC_KEY seg_key);
1066 
1073  static HPoint GetTransformedCentroid(HC_KEY seg_key, float matrix[] = 0);
1074 
1082  static void URIencode(const char * in_string, MVO_POINTER_SIZED_UINT n, char * out_buffer);
1090  static void URIdecode(const char * in_string, char * out_buffer, MVO_POINTER_SIZED_UINT * n);
1091 
1100  static void GetCameraFromMatrix(float matrix[], HPoint *target, HPoint *position, HPoint *up_vector, HPoint *translation);
1101 
1110  static void GetMatrixFromCamera(HPoint target, HPoint position, HPoint up_vector, HPoint translation, float matrix[]);
1111 
1112 
1146  static void GetCameraFromGLFrustum(double const left, double const right, double const bottom , double const top, double const near_z, double const far_z, bool const perspective,
1147  HPoint &pos, HPoint &target, HPoint &up, char * projection, double &width, double &height, double &near_limit );
1148 
1156  static bool PushAttribute(const char *attName);
1157 
1166  static void PushAttribute(const char *attName, const char *attText);
1167 
1175  static bool PopAttribute(const char *attName);
1176 
1187  static bool ModifyPushedAttribute(const char *attName, const char *newStyle);
1188 
1195  static bool ShowPushedAttribute(const char *attName, HUserOptions& attText);
1196 
1209  static void Recursive_Merge_Shells( HShell *total_info, HShell *max_info, bool do_recurse, bool delete_orig_shells = false, bool insert_null_lods = false );
1210 
1217  static HC_KEY Merge_Shells( bool do_recurse, bool delete_orig_shells = false , bool optimize_shell = true, bool generate_regions = false);
1218 
1226  static HC_KEY Merge_Shells_Generate_Regions( int num_shells, HC_KEY * shell_keys, bool delete_orig_shells = false );
1227 
1237  static void Generate_LODs( bool do_recurse = true, bool delete_orig_shells = false, bool insert_null_lods = false, int n_lod_levels = 2, float reduction_ratio = 0.20 );
1238 
1246  static bool Segment_Shell_Allocate( HShell *total_info, HShell *max_info, bool do_recurse );
1247 
1255  static void Shell_Search( HShell *total_info, HShell *max_info, bool do_recurse );
1256 
1257 
1258 
1269  static void OptimizeSegmentTree(HC_KEY old_seg_key, HC_KEY *new_seg_key, bool transform_shells = true, bool merge_shells = true, bool create_shell_regions = false);
1270 
1271 
1280  static void CountShellData(HC_KEY shell_key, int * faces, int * vertices, int * triangles, int * tristrips = 0);
1281 
1288  static void FindFileNameExtension(const char * filename_in, char * ext_out, int size = -1);
1289 
1296  static void FindFileNameExtension(__wchar_t const * const filename_in, __wchar_t * ext_out, int size = -1);
1297 #ifdef H_USHORT_OVERLOAD
1298  static void FindFileNameExtension(unsigned short const * const filename_in, unsigned short * ext_out, int size = -1){
1299  FindFileNameExtension((wchar_t const * const)filename_in, (wchar_t*)ext_out, size);
1300  }
1301 #endif
1302 
1307  static void FindUnicodeFileNameExtension(const unsigned short * filename_in, char * ext_out);
1308 
1316  static void FindFileNameAndDirectory(const char * filename_in, char * dir_out, char * filename_out);
1324  static void FindFileNameAndDirectory(__wchar_t const * filename_in, __wchar_t * dir_out, __wchar_t * filename_out);
1325 
1336  static const char* extra_pointer_format();
1340  static HC_KEY CreateScaleIndependentSegment(const char *segname, bool SetCallback = true);
1341 
1345  static HC_KEY GetScaleIndependentGeomSegmentKey(HC_KEY segkey);
1346 
1350  static void SetScaleIndependentGeomPosition(HC_KEY segkey, float x, float y, float z);
1351 
1355  static void GetScaleIndependentGeomPosition(HC_KEY segkey, float &x, float &y, float &z);
1356 
1360  static void RegisterCallbacks();
1361 
1368  static bool IsModelKey(HC_KEY modelkey, HC_KEY objectkey);
1369 
1377  static HC_KEY UserOptionExists(HC_KEY key, const char *attrib, char *result);
1378 
1395  static void InsertRotatedArrow(float stick_length, float tip_length, float stick_radius, float tip_radius, float distance, int adelta, float rotang, const char *stick_color, const char *tip_color, int num_sides, float tip_falloff, bool reverse);
1396 
1406  static int CalculateKeyPath(HC_KEY startkey, HBaseView *view, HC_KEY *keyarray, int maxarray);
1407 
1412  static bool SegmentExists(const char *segment);
1413 
1416  static void UnsetAttributes();
1417 
1425  static int IsChildOf(HC_KEY owner, HC_KEY child, HC_KEY klist[] = 0);
1426 
1432  static bool IsIdentityMatrix(float matrix[]);
1433 
1440  static void ComputeShellNormal(HC_KEY skey, HPoint &tnormal);
1441 
1451  static HC_KEY SelectUnderCursor(HBaseView *view, float x, float y, bool doSelection = true, bool DeSelect = false);
1452 
1453 
1464  static HC_KEY SmartSelectUnderCursor(HBaseView *view, float x, float y, bool doSelection = true, bool DeSelect = false);
1465 
1466 
1473  static bool ShowOneHeuristic(const char *type, char *res = 0);
1480  static bool ShowOneRenderingOption(const char *type, char *res = 0);
1481 
1491  static float EaseInEaseOut(float t, float a, float b, float c);
1492 
1497  static void UnwindIncludes(HC_KEY &key);
1498 
1505  static void UnwindIncludes(HC_KEY &newkey, HC_KEY *keys, int count);
1506 
1507 
1514  static bool SafeSetUserOption(const char * opt);
1515 
1522  static bool SafeShowUserOption(char * opt);
1523 
1524 
1529  static void ProjectShell(HC_KEY shellkey);
1530 
1537  static HC_KEY MergeShells(HC_KEY shell1, HC_KEY shell2);
1538 
1544  static void ShowModellingMatrix(float *segment_modelling_matrix);
1545 
1552  static void ConvertLocalPixelsToLocalWindow(HBaseView * view, HPoint *in_system , HPoint *out_system = 0);
1553 
1554 
1561  static HC_KEY GrabSegment(HC_KEY key);
1562 
1567 # define MakeSegment(key) GrabSegment(key)
1568 
1574  static void RenameSegment(HC_KEY segkey, const char *newname);
1575 
1576 
1587  static void InterpolateNormalAlongEdge(HPoint &p1, HPoint &n1, HPoint &p2, HPoint &n2, HPoint &p3, HPoint &n3);
1588 
1594  static void ShowNormals(HC_KEY shellkey, float normallength);
1595 
1601  static bool IsSegmentKey(HC_KEY key);
1602 
1609  static int FindContents(HC_KEY &key);
1610 
1617  static int CalculateMajorAxis(HBaseView *view);
1618 
1619 
1627  static HC_KEY FindOneObject(const char *type, bool l = 0);
1633  static void CloseAllSegments(HC_KEY endkey = INVALID_KEY);
1634 
1639  static void ReadjustTarget(HBaseView *view);
1640 
1645  static bool GetAllowAnimation(HC_KEY key);
1646 
1649  static void SuppressAnimation();
1650 
1658  static int FindFaceByIndex(int findex, int *flist, int flen);
1659 
1666  static bool ShowOneUserOption(const char *option, char *res);
1667 
1673  static HC_KEY GetNextRenumberedKey(HBaseView *view);
1674 
1680  static void NameSegments(HC_KEY &key, HBaseView *view);
1681 
1687  static void MoveToTemp(HC_KEY movekey, HC_KEY tempkey);
1688 
1699  static void ShowContentsWithPath( const char * entitytypes, struct vlist_s **ret_pathlist, bool storePath = false, bool includeIncludes = true, bool filterIncludes = true);
1700 
1701 
1707  static int ustrlen(unsigned short *text);
1708 
1718  static bool RLECompress(int const in_len,
1719  unsigned char const * const in_buf,
1720  int * out_len,
1721  unsigned char * const out_buf);
1722 
1732  static bool ZlibCompress(int const in_len,
1733  unsigned char const * const in_buf,
1734  int & out_len,
1735  unsigned char * const out_buf);
1736 
1746  static bool ZlibDecompress(int const in_len,
1747  unsigned char const * const in_buf,
1748  int & out_len,
1749  unsigned char * const out_buf);
1755  static unsigned short *uconvert(const char *text);
1756 
1767  static bool BuildIncludePath(HC_KEY objectkey, const HC_KEY *includelist, int ilength, HC_KEY *fullpath, int *fplength, HC_KEY matchkey = INVALID_KEY);
1768 
1775  static void BuildIncludePathFromSelection(HSmartSelItem *sitem, int &plen, HC_KEY *fullpath);
1776 
1777 
1786  static void MakeViewSnapshot(HBaseView * view, int width, int height, char ** data);
1787 
1793  static void MakeViewSnapshot(HBaseView * view, HC_KEY image_key);
1794 
1803  static int ConstrainToVector( const float matrix_in[], const HVector &vector, float matrix_out[]);
1804 
1812  static void Camera_To_Transform (HCamera *camera , float *pos, float projection_matrix[], float complete_matrix[]);
1823  static void LocalPixelsToWorld(HCamera *camera, bool righthanded, float xres, float yres, int xwpix, int ywpix, float result[]);
1830  static float ComputeAngleBetweenVector(HPoint p1, HPoint p2);
1831 
1832 
1838  static int strlen16( const unsigned short *p16);
1839 
1848  static void CalculateBoundingInfo(HC_KEY startkey, HPoint &min, HPoint &max, HPoint &delta, HPoint &mid);
1849 
1859  static long ClipPolygonAgainstPlane(long vertexCount, const HPoint vertex[],
1860  const float plane[], HPoint result[], bool *noCut = 0);
1861 
1868  static HFileOutputResult TwoPassPrint(const char *driver, HOutputHandlerOptions *options);
1869 
1877  static HC_KEY OpenSegmentFromKey(HC_KEY key, char *segment);
1878 
1879 
1891  static bool IsPointInsideAllEdges( const float *pt,const float points1[],
1892  int len, const int face1[], const float plane1[], float fudge );
1900  static void IntersectionLinePlane(HPoint *p1, HPoint *p2, HPlane *p, HPoint *res);
1901 
1907  static void DeleteManipulators(HC_KEY key);
1908 
1909 
1924  static void MergePointsIntoShell(int num_shell_points, HPoint plist1[], int num_shell_facelist, int flist1[],
1925  int num_merge_points, HPoint merge_points[], HPoint merge_vectors[],
1926  float tolerance, bool AddExtraPoints, int newpoints[], int *newpointslen);
1927 
1928 
1943  static void SubdivideShells(HC_KEY sskey, HC_KEY startkey, HC_KEY newkey, int numx, int numy, int numz, ShellToRegionMapper *mapper = 0, bool DoCut = true, bool DeleteOriginalShells = false, bool breakShells = false);
1944 
1946  static void MergePolylines();
1947  static void CreateZebraStripeTexture(int width, int height, int stripwidth, bool horizontal, HPixelRGB colorstripes, HPixelRGB colorbackground);
1948 
1956  static void ascii_to_unicode(char const *ascii, unsigned short *unicode);
1957 
1965  static void unicode_to_ascii(unsigned short const *unicode, char *ascii);
1966 
1975  static void BatchRead(HBaseModel * model, const char * directory, const char * extension);
1976 
1984  static void AdjustPositionToPlane(HBaseView * view, HPoint &position, HPoint point_in_plane);
1985 
1994  static void CalculateCornerImagePosition(HBaseView *view, int iwidth, int iheight, HWindowCorner corner, float &posx, float &posy);
1995  static void OptimizeModelByGrid(HBaseView *view, ShellToRegionMapper *mapper);
1996  static void DecipherTextureString(char *texdef, char *Source, bool *DownSampling = 0, bool *DownSamplingSet = 0, char *ParameterizationSource = 0,
1997  char *InterpolationFilter = 0, char *DecimationFilter = 0, char *Layout = 0, char *Tiling = 0, bool *ValueScaleSet = 0,
1998  bool *ValueScale = 0, float *ValueScaleMin =0, float *ValueScaleMax = 0, char *BlendingMode = 0);
1999 
2000 
2001 private:
2002  static void scale_segment (HIC_Rendition *rendition,HIC_Segment_Info * geo3);
2003  static void activity_change (HIC_Segment *seg, int old_activity, int new_activity);
2004  static bool RestoreAttributeFromOption(const char *attName, HUserOptions& attText);
2005  static void ReplaceCharacter(char *text, char orig, char target);
2006  static bool SetAttribute(const char *attName, const char *attText);
2007  static bool ShowAttribute(const char *attName, char *attText);
2008  static void ShowContentsWithPathAddEntity(HC_KEY key, struct vlist_s *pathlist, int level, HC_KEY *patharray, bool storePath);
2009  static void ShowContentsWithPathRecursive(HC_KEY key, const char *entitytypes, struct vlist_s *pathlist, HC_KEY *patharray, int level, bool storePath, bool includeIncludes, bool filterIncludes);
2010  static void SubdivideOneShell(HShellWrapper &myshell, int numx, int numy, int numz, HPoint &totalmin,
2011  HPoint &totaldeltadiv, HShellWrapper *shellmatrix, HShellWrapper &leftover, float boxdiagonallength, bool DoCut, int regionnum, ShellToRegionMapper *mapper, HC_KEY newkey);
2012 
2013 
2014 };
2015 
2016 
2017 class MVO_API HQualifiedKey
2018 {
2019 public:
2020  HQualifiedKey(HC_KEY key, HC_KEY includelist[], int includelistlength)
2021  {
2022  m_Key = key;
2023  m_pIncludeList = 0;
2024  m_pIncludeList = new HC_KEY[includelistlength];
2025  for (int i = 0; i < includelistlength; i++)
2026  m_pIncludeList[i] = includelist[i];
2027  m_IncludeListLength = includelistlength;
2028  }
2029  ~HQualifiedKey()
2030  {
2031  delete [] m_pIncludeList;
2032  }
2033 
2034  long MakeHashKey()
2035  {
2036  return MakeHashKey(m_Key, m_IncludeListLength,m_pIncludeList);
2037  }
2038 
2039  static long MakeHashKey(HC_KEY key, int includelength, HC_KEY includes[])
2040  {
2041  long hashkey = static_cast<long>(key);
2042  for (int i = 0; i < includelength; i++)
2043  {
2044  hashkey += static_cast<long>(includes[i]);
2045  }
2046  return hashkey;
2047  }
2048 
2049  HC_KEY m_Key;
2050  HC_KEY * m_pIncludeList;
2051  int m_IncludeListLength;
2052 };
2053 
2054 
2055 
2056 
2057 class MVO_API HMergeShellFace
2058 {
2059 
2060 public:
2061  HMergeShellFace()
2062  {
2063  m_pChildFaces = 0;
2064  m_ChildFaceNum = 0;
2065  }
2066  ~HMergeShellFace()
2067  {
2068  if (m_pChildFaces)
2069  delete [] m_pChildFaces;
2070  if (m_pFlist)
2071  delete [] m_pFlist;
2072 
2073  }
2074  void Init(int * flist);
2075  void MakeChildFaces(int & addpoint, HPoint * points, bool AddExtraPoints, int * newpoints, int * newpointslen);
2076  void Divide(int pnum, HPoint * points);
2077 
2078  bool CheckHit(HPoint & p, HPoint & normal, HPoint * plist, HPoint & pres);
2079  HMergeShellFace * FindHitFaceRecursive(HPoint & p, HPoint & normal, HPoint * plist, HPoint & respoint);
2080  HMergeShellFace * FindHitFace(HPoint & p, HPoint & normal, HPoint * plist, HPoint & respoint)
2081  {
2082  return FindHitFaceRecursive(p, normal, plist,respoint);
2083  }
2084  bool CheckIfColinear(HPoint * point);
2085 
2086  int GetLengthRecursive(int l);
2087 
2088  int GetLength()
2089  {
2090  return GetLengthRecursive(0);
2091 
2092  }
2093 
2094  int AddToFacelistRecursive(int * start, int l);
2095 
2096  int AddToFacelist(int * start)
2097  {
2098  return AddToFacelistRecursive(start, 0);
2099 
2100  }
2101 
2102 protected:
2103  HMergeShellFace * m_pChildFaces;
2104  int m_flen;
2105  int * m_pFlist;
2106  int m_ChildFaceNum;
2107 };
2108 
2109 
2110 
2111 class MVO_API ColorPiece{
2112 
2113 public:
2114  ColorPiece(int index[], int len, int col)
2115  {
2116  m_uvindex = new int[len];
2117  m_fllen = new int[len];
2118  m_flindex = new int[len];
2119  for (int i=0;i<len;i++)
2120  m_uvindex[i] = index[i];
2121  m_len = len;
2122  m_col = col;
2123  m_done = false;
2124 
2125  }
2126  ~ColorPiece()
2127  {
2128  delete [] m_uvindex;
2129  delete [] m_fllen;
2130  delete [] m_flindex;
2131  }
2132  int *m_uvindex;
2133  int *m_fllen;
2134  int *m_flindex;
2135  int m_len;
2136  int m_col;
2137 
2138  bool m_done;
2139 
2140 };
2141 
2142 class MVO_API ColorPieceList
2143 {
2144 public:
2145  ColorPieceList();
2146  ~ColorPieceList();
2147  void AddColorPiece(int index[], int len, int col);
2148  ColorPiece * FindMatch(int col, int ii, int ii2, int &rpos, int &rlen, bool &reverse);
2149 
2150  struct vlist_s* m_ColorPieceList;
2151 
2152 
2153 };
2154 
2155 class MVO_API HVerticalUtility :
2156  public HUtility
2157 {
2158 public:
2159 
2160  static void ColorizePointCloud(HC_KEY const segment);
2161 };
2162 
2163 
2164 
2165 class MVO_API HAbsoluteWindow
2166 {
2167 public:
2168  HAbsoluteWindow(HBaseView *view, HC_KEY key,float xpos, float ypos, float width, float height, AbsoluteWindowType xpos_type = RelativeLeft,
2169  AbsoluteWindowType ypos_type = RelativeTop, AbsoluteWindowType width_type = RelativeLeft,
2170  AbsoluteWindowType height_type = RelativeTop, bool sb = false);
2171  HAbsoluteWindow(HBaseView *view, HC_KEY key);
2172  void DecipherOptions();
2173  void AdjustX(float invalue, AbsoluteWindowType wt, float &outvalue);
2174  void AdjustY(float invalue, AbsoluteWindowType wt, float &outvalue);
2175  bool Adjust();
2176  static void AdjustAll(HBaseView *view);
2177  static bool SetWindow(HBaseView *view,float xpos, float ypos, float width, float height, AbsoluteWindowType xpos_type = RelativeLeft,
2178  AbsoluteWindowType ypos_type = RelativeTop, AbsoluteWindowType width_type = RelativeLeft,
2179  AbsoluteWindowType height_type = RelativeTop, bool sb = false);
2180  bool IsPositionInWindow(float x, float y);
2181  static bool IsPositionInWindow(HBaseView *view, float x, float y);
2182  static void CalculateLocalWindowPos(HBaseView *view, float x, float y, float &xout, float &yout);
2183  void CalculateLocalWindowPos(float x, float y, float &xout, float &yout);
2184  static void CalculateOuterWindowPos(HBaseView *view, float x, float y, float &xout, float &yout);
2185  void CalculateOuterWindowPos(float x, float y, float &xout, float &yout);
2186 
2187 
2188 
2189  HBaseView *m_pView;
2190  float m_width;
2191  float m_height;
2192  float m_xpos;
2193  float m_ypos;
2194  AbsoluteWindowType m_xpos_type;
2195  AbsoluteWindowType m_ypos_type;
2196  AbsoluteWindowType m_width_type;
2197  AbsoluteWindowType m_height_type;
2198 
2199  bool m_bShowBackground;
2200 
2201  HC_KEY m_key;
2202 
2203 };
2204 
2205 
2206 
2208 
2223 class MVO_API HUnicodeOptions
2224 {
2225 public:
2226 
2227  wchar_t* m_data;
2228  int m_length;
2229  bool m_valid;
2230 
2232  HUnicodeOptions();
2233 
2235  HUnicodeOptions(const HUnicodeOptions& in_data);
2236 
2237 
2239  ~HUnicodeOptions();
2240 
2241 
2245  bool IsValid();
2246 
2251  const __wchar_t * Show_Unicode_Options();
2252 
2257  const wchar_t* Show_One_Net_Unicode_Option(const __wchar_t* which);
2258 #ifdef _MSC_VER
2259  const unsigned short * Show_One_Net_Unicode_Option(const unsigned short * which);
2260 #endif
2261 
2266  const wchar_t * Show_One_Unicode_Option(const __wchar_t * which);
2267 #ifdef _MSC_VER
2268  const unsigned short * Show_One_Unicode_Option(const unsigned short * which);
2269 #endif
2270 
2274  const __wchar_t* Show_Net_Unicode_Options();
2275 
2276 private:
2277 
2278  void clear() {
2279  delete [] m_data;
2280  m_data = 0;
2281  m_length = 0;
2282  m_valid = false;
2283  }
2284 
2285 };
2286 
2287 
2288 
2289 class BREP_Topology;
2290 
2292 {
2293 public:
2294  BREP_Edge(HC_KEY edgekey)
2295  {
2296  m_edgekey = edgekey;
2297  m_vertex1 = INVALID_KEY;
2298  m_vertex2 = INVALID_KEY;
2299  }
2300 
2301  HC_KEY m_edgekey;
2302  HC_KEY m_vertex1;
2303  HC_KEY m_vertex2;
2304 
2305 };
2306 
2308 {
2309 public:
2310  BREP_CoEdge(BREP_Edge *edge)
2311  {
2312  m_edge = edge;
2313  }
2314 
2315  BREP_Edge * m_edge;
2316 };
2317 
2318 
2319 class MVO_API BREP_Face
2320 {
2321 public:
2322  BREP_Face(HC_KEY facekey);
2323  ~BREP_Face();
2324 
2325  BREP_Edge * AddCoEdge(BREP_Topology *topol, void *edgeid, HC_KEY edgekey);
2326 
2327 
2328  struct vlist_s * m_CoEdgeList;
2329  HC_KEY m_facekey;
2330 };
2331 
2332 class MVO_API BREP_Topology
2333 {
2334 public:
2335 
2336  struct vhash_s * m_FaceHash;
2337 
2338  struct vhash_s * m_EdgeHash;
2339  struct vhash_s * m_VertexHash;
2340 
2341  BREP_Face *m_CurrentFace;
2342  BREP_Topology();
2343  ~BREP_Topology();
2344  BREP_Face *AddFace(HC_KEY facekey);
2345  BREP_Face *GetFace(HC_KEY facekey);
2346  BREP_Edge *FindEdge(void *edgeid);
2347  BREP_Edge *AddEdge(void *edgeid, HC_KEY edgekey);
2348  HC_KEY AddVertex(void *vertexid, HPoint vpos);
2349  HC_KEY FindVertex(void *vertexid);
2350 
2351 
2352 
2353  BREP_Face *GetCurrentFace() { return m_CurrentFace; }
2354 
2355 };
2356 
2357 class H_FORMAT_TEXT;
2358 
2359 class MVO_API HBestImageDriver
2360 {
2361 private:
2362  H_FORMAT_TEXT * m_dvr;
2363 public:
2364  HBestImageDriver(char const * prefer_type = 0);
2365  ~HBestImageDriver();
2366 
2367  HC_KEY GetKey() const;
2368 
2369  operator char const* () const;
2370 };
2371 
2372 
2373 class MVO_API HPVOOptions
2374 {
2375  private:
2376  void * impl;
2377 
2378  public:
2379  HPVOOptions(char const * filename);
2380  ~HPVOOptions();
2381  char const * getOption(char const * option) const;
2382 };
2383 
2384 
2385 #ifdef H_PACK_8
2386 #pragma pack(pop)
2387 #endif
2388 
2389 #endif
The HPixelRGB class is the data type of a rgb pixel.
Definition: HGlobals.h:471
HShellWrapper()
Definition: HUtility.h:307
The HShellObject class is a simple wrapper for a shell.
Definition: HUtility.h:198
int point_list_len
The length of the point list,.
Definition: HUtility.h:267
int m_facepointer
Definition: HUtility.h:519
void Show_One_User_Option(const char *type, char *value)
double w
The knot value of a B-Surface vertex.
Definition: HUtility.h:593
int region_count
The number of regions in the shell.
Definition: HUtility.h:275
HShellWrapper(HC_KEY key)
Definition: HUtility.h:291
The HUtility class contains a set of utility functions and data structures used widely in MVO classes...
Definition: HUtility.h:788
Definition: HUtility.h:2111
static const float PI
default=3.1415926f
Definition: HUtility.h:792
Definition: HUtility.h:2307
Definition: HUtility.h:2332
char * m_data
actual char* to the user options
Definition: HUtility.h:723
Definition: HUtility.h:2165
Definition: HUtility.h:2155
wchar_t * m_data
actual char* to the user options
Definition: HUtility.h:2227
The HCamera class is the data type of a HOOPS Camera Attribute.
Definition: HUtility.h:537
HPoint * point_list
The list of vertices that define the shell.
Definition: HUtility.h:268
void Show()
Definition: HUtility.h:571
HPoint up_vector
The direction of up.
Definition: HUtility.h:542
bool valid
True if the object has been initialized.
Definition: HUtility.h:539
void Show_User_Options(char *list)
double y
The y-coordinate of a B-Surface vertex.
Definition: HUtility.h:591
The HShellRegion class is a simple wrapper for a shell's region.
Definition: HUtility.h:164
HVector * normal_list
The list of normal vectors associated with the shell.
Definition: HUtility.h:269
#define HC_KEY
HC_KEY * patharray
Array of Keys.
Definition: HUtility.h:681
The HSmartSelItem - selection item which can handle instancing.
Definition: HSelectionItem.h:187
Definition: HUtility.h:2142
void Set(int first, int second)
Definition: HUtility.h:101
class HPoint HVector
The HVector class is the data type of a three-dimensional vector.
Definition: HGlobals.h:326
void EndFaceIteration()
Definition: HUtility.h:379
float field_height
The height of the field of view.
Definition: HUtility.h:544
int len
length of key array
Definition: HUtility.h:682
int face_count
The number of faces in the shell.
Definition: HUtility.h:273
int * m_Flist
The list that defines the configuration of the faces in the shell in relation to the points as descri...
Definition: HUtility.h:515
HC_KEY m_Key
The key of the shell.
Definition: HUtility.h:516
int m_plen
The number of points in the points list.
Definition: HUtility.h:509
Definition: HUtility.h:2057
The HUnicodeOptions class is a helper class which wraps up memory management for variable size Unicod...
Definition: HUtility.h:2223
double z
The z-coordinate of a B-Surface vertex.
Definition: HUtility.h:592
Definition: HUtility.h:59
The HUserOptions class is a helper class which wraps up memory management for variable size user opti...
Definition: HUtility.h:719
HPoint target
The area that the camera is directed at.
Definition: HUtility.h:541
void InvalidateCamera()
Definition: HUtility.h:553
HPolyline * m_pNextPolyline
A pointer to a single HPolyline object.
Definition: HUtility.h:610
int face_list_len
The length of the face list.
Definition: HUtility.h:271
int m_flen
The length of the face list.
Definition: HUtility.h:510
The HShellVertexData class encapsulates colormap index information associated with the vertices of a ...
Definition: HUtility.h:618
HPoint * m_pHPointArray
A pointer to an array of HPoint objects.
Definition: HUtility.h:609
void Show_Unicode_Options(unsigned short *options)
int GetFirst() const
Definition: HUtility.h:94
int m_totalplen
Definition: HUtility.h:523
The HBaseModel class is used to store and manage model information.
Definition: HBaseModel.h:47
The HPoint class is the data type of a three-dimensional point.
Definition: HGlobals.h:121
Definition: HIOManager.h:824
The HBaseView class defines and manages a view of model information.
Definition: HBaseView.h:332
Definition: HUtility.h:2359
The HShell class is the data type of a HOOPS Shell.
Definition: HUtility.h:247
int m_length
length of current user option
Definition: HUtility.h:724
int * region_list
The list that defines the set of regions in the shell.
Definition: HUtility.h:276
Definition: HUtility.h:2017
void Show_One_Unicode_Option(const unsigned short *requestedOption, unsigned short *options)
The HShellFace class is a simple wrapper for a shell's face.
Definition: HUtility.h:127
int GetSecond() const
Definition: HUtility.h:96
static const float EH_Epsilon
default=0.01
Definition: HUtility.h:797
The HShellWrapper class is wraps shell information and provides methods to manipulate this informatio...
Definition: HUtility.h:284
The HShellEdge class is a simple wrapper for a shell's edge.
Definition: HUtility.h:84
HPoint position
The location of the camera.
Definition: HUtility.h:540
double x
The x-coordinate of a B-Surface vertex.
Definition: HUtility.h:590
void Set() const
Definition: HUtility.h:577
void Set(double X, double Y, double Z, double W)
Definition: HUtility.h:597
Definition: HUtility.h:2291
The HPlane class is the data type of a plane.
Definition: HGlobals.h:333
int m_PointCount
Number of points in the polyline.
Definition: HUtility.h:608
Definition: HUtility.h:2373
The HShowContentsWithPathType struct is used by HUtility to store a keypath.
Definition: HUtility.h:679
The HBSurfVertex class is the data type of a B-Surface vertex.
Definition: HUtility.h:587
int * face_list
The face list that defines how faces are formed in the shell.
Definition: HUtility.h:272
HC_KEY GetKey()
Definition: HUtility.h:348
HShellEdge(int iFirst=0, int iSecond=0)
Definition: HUtility.h:90
The HPolyline class is the data type for a three-dimensional polyline.
Definition: HUtility.h:605
Definition: HUtility.h:44
Definition: HUtility.h:2319
int m_length
length of current user option
Definition: HUtility.h:2228
float field_width
The width of the field of view.
Definition: HUtility.h:543
int m_totalflen
Definition: HUtility.h:521