AGCVector.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /////////////////////////////////////////////////////////////////////////////
  2. // AGCVector.h : Declaration of the CAGCVector
  3. //
  4. #ifndef __AGCVector_H_
  5. #define __AGCVector_H_
  6. #include <AGC.h>
  7. #include <..\TCLib\ObjectLock.h>
  8. #include "resource.h"
  9. /////////////////////////////////////////////////////////////////////////////
  10. // CAGCVector
  11. class ATL_NO_VTABLE CAGCVector :
  12. public IDispatchImpl<IAGCVector, &IID_IAGCVector, &LIBID_AGCLib>,
  13. public IAGCVectorPrivate,
  14. public ISupportErrorInfo,
  15. public IPersistStreamInit,
  16. public IPersistPropertyBag,
  17. public AGCObjectSafetyImpl<CAGCVector>,
  18. public CComObjectRootEx<CComMultiThreadModel>,
  19. public CComCoClass<CAGCVector, &CLSID_AGCVector>
  20. {
  21. // Declarations
  22. public:
  23. DECLARE_REGISTRY_RESOURCEID(IDR_AGCVector)
  24. DECLARE_PROTECT_FINAL_CONSTRUCT()
  25. DECLARE_GET_CONTROLLING_UNKNOWN()
  26. // Interface Map
  27. public:
  28. BEGIN_COM_MAP(CAGCVector)
  29. COM_INTERFACE_ENTRY(IAGCVector)
  30. COM_INTERFACE_ENTRY(IAGCVectorPrivate)
  31. COM_INTERFACE_ENTRY(IDispatch)
  32. COM_INTERFACE_ENTRY(ISupportErrorInfo)
  33. COM_INTERFACE_ENTRY(IPersistStreamInit)
  34. COM_INTERFACE_ENTRY(IPersistPropertyBag)
  35. COM_INTERFACE_ENTRY2(IPersistStream, IPersistStreamInit)
  36. COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
  37. COM_INTERFACE_ENTRY_AUTOAGGREGATE(IID_IMarshal, m_punkMBV.p,
  38. CLSID_TCMarshalByValue)
  39. COM_INTERFACE_ENTRY(IObjectSafety)
  40. END_COM_MAP()
  41. // Category Map
  42. public:
  43. BEGIN_CATEGORY_MAP(CAGCVector)
  44. IMPLEMENTED_CATEGORY(CATID_AGC)
  45. IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
  46. IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
  47. END_CATEGORY_MAP()
  48. // Construction
  49. public:
  50. CAGCVector() :
  51. m_bDirty(false)
  52. {
  53. m_vector.SetX(0);
  54. m_vector.SetY(0);
  55. m_vector.SetZ(0);
  56. }
  57. // Implemenatation
  58. protected:
  59. static HRESULT GetRawVector(IAGCVector* pVector, Vector* pVectorRaw);
  60. static HRESULT CreateResultVector(const Vector* pVectorRaw,
  61. IAGCVector** ppResult);
  62. // ISupportsErrorInfo Interface Methods
  63. public:
  64. STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
  65. // IAGCVector Interface Methods
  66. public:
  67. STDMETHODIMP put_X(float Val);
  68. STDMETHODIMP get_X(float* pVal);
  69. STDMETHODIMP put_Y(float Val);
  70. STDMETHODIMP get_Y(float* pVal);
  71. STDMETHODIMP put_Z(float Val);
  72. STDMETHODIMP get_Z(float* pVal);
  73. STDMETHODIMP put_DisplayString(BSTR bstrDisplayString);
  74. STDMETHODIMP get_DisplayString(BSTR* pbstrDisplayString);
  75. STDMETHODIMP InitXYZ(float xArg, float yArg, float zArg);
  76. STDMETHODIMP InitCopy(IAGCVector* pVector);
  77. STDMETHODIMP InitRandomDirection();
  78. STDMETHODIMP InitRandomPosition(float fRadius);
  79. STDMETHODIMP get_IsZero(VARIANT_BOOL* pbIsZero);
  80. STDMETHODIMP get_IsEqual(IAGCVector* pVector, VARIANT_BOOL* pbIsEqual);
  81. STDMETHODIMP get_Length(float* pfLength);
  82. STDMETHODIMP get_LengthSquared(float* pfLengthSquared);
  83. STDMETHODIMP get_OrthogonalVector(IAGCVector** ppResult);
  84. STDMETHODIMP Add(IAGCVector* pVector,IAGCVector** ppResult);
  85. STDMETHODIMP Subtract(IAGCVector* pVector, IAGCVector** ppResult);
  86. STDMETHODIMP Multiply(float f, IAGCVector** ppResult);
  87. STDMETHODIMP Divide(float f, IAGCVector** ppResult);
  88. STDMETHODIMP Normalize(IAGCVector** ppResult);
  89. STDMETHODIMP CrossProduct(IAGCVector* pVector, IAGCVector** ppResult);
  90. STDMETHODIMP Interpolate(IAGCVector* pVector, float fValue, IAGCVector** ppResult);
  91. STDMETHODIMP AddInPlace(IAGCVector* pVector);
  92. STDMETHODIMP SubtractInPlace(IAGCVector* pVector);
  93. STDMETHODIMP MultiplyInPlace(float f);
  94. STDMETHODIMP DivideInPlace(float f);
  95. STDMETHODIMP NormalizeInPlace();
  96. STDMETHODIMP CrossProductInPlace(IAGCVector* pVector);
  97. STDMETHODIMP InterpolateInPlace(IAGCVector* pVector, float fValue);
  98. // IAGCVectorPrivate Interface Methods
  99. public:
  100. STDMETHODIMP InitFromVector(const void* pvVector);
  101. STDMETHODIMP CopyVectorTo(void* pvVector);
  102. // IPersist Interface Methods
  103. public:
  104. STDMETHODIMP GetClassID(CLSID* pClassID);
  105. // IPersistStreamInit Interface Methods
  106. public:
  107. STDMETHODIMP IsDirty();
  108. STDMETHODIMP Load(LPSTREAM pStm);
  109. STDMETHODIMP Save(LPSTREAM pStm, BOOL fClearDirty);
  110. STDMETHODIMP GetSizeMax(ULARGE_INTEGER* pCbSize);
  111. STDMETHODIMP InitNew(void);
  112. // IPersistPropertyBag Interface Methods
  113. public:
  114. STDMETHODIMP Load(IPropertyBag* pPropBag, IErrorLog* pErrorLog);
  115. STDMETHODIMP Save(IPropertyBag* pPropBag, BOOL fClearDirty,
  116. BOOL fSaveAllProperties);
  117. // Enumerations
  118. protected:
  119. enum {DIMENSIONS = 3};
  120. // Types
  121. protected:
  122. typedef TCObjectLock<CAGCVector> XLock;
  123. // Data Members
  124. private:
  125. Vector m_vector; // the actual vector data goes here!
  126. bool m_bDirty;
  127. public:
  128. CComPtr<IUnknown> m_punkMBV;
  129. };
  130. /////////////////////////////////////////////////////////////////////////////
  131. #endif //__AGCVector_H_