! | Данная информация предназначена только только для IT-специалистов по системной интеграции модулей БИОСОФТ-М. (см. Руководства пользователя к программным продуктам) |
В OpenGL Lib все происходит в текущей сцене. Получить объект сцены можно здесь:
class COpenGlIfaceGp : public object { public: // The Scene we are working with ref<COpenGlSceneIfaceGp> x_rOpenGlScene, abstract; ref<COpenGlSceneIfaceGp> x_rOpenGlScene_Get() new virtual auto; };
Для сцены можно задать модели (3-х мерные и прочие объекты), которые в ней участвуют. Модель представлена следующим классом:
// COpenGlModelIfaceGp.h #pragma once class point3d; class COpenGlTextureIfaceGp; class CExtra3dCryptoStorageIfaceGp; class CExtra3dCryptoIfaceGp; class COpenGlMaterialIfaceGp; class COpenGlIfaceGp; // // COpenGlModelIfaceGp - Represents a single 3D-model for OpenGl // ASSUME_IMPL_FOR_IFACE(COpenGlModelImpl, COpenGlModelIfaceGp) class COpenGlModelIfaceGp : public object { public: COpenGlModelIfaceGp(); //NEW_LOCAL(COpenGlModelImpl, COpenGlModelIfaceGp) NEW_GP(Extra3d, COpenGlModelImpl, COpenGlModelIfaceGp) virtual void OnExposeContent( ref<CExpose> rExpose); // Constants // Attributes // parent //ptr<> _x_p, // auto(Get, Set); // debug helper or any other // used for model identification by advanced user str x_sModelId = "", auto(Get, Set), assert(true); // allow model selection in Ui bool x_bSelectable = true, auto(Get, Set); // exclude from render bool x_bDoNotRender = false, auto(Get, Set); // Object creation // 3d model ref<COpenGlModelIfaceGp> NewOpenGlModel3d() new virtual auto; // 2d model ref<COpenGlModelIfaceGp> NewOpenGlModel2d() new virtual auto; // 2d/3d common operations // selection key for current model rgb GetSelectionKey() new virtual auto; // 3d related Operations // load model from a specialy composed raw file void LoadFromRawFile( path pathFull, ref<CExtra3dCryptoStorageIfaceGp> rExtra3dCryptoStorage, ref<COpenGlIfaceGp> rOpenGl) new virtual auto; // set material for model void AssignMaterial( type<COpenGlMaterialIfaceGp> typeOpenGlMaterial) new virtual auto; // current material type<COpenGlMaterialIfaceGp> GetCurrentMaterial() new virtual auto; // creates raw data which can be handled later by this // class from 3ds file sbuf CreateRawDataFrom3dsFile( path pathFull) new virtual auto; // 2d related Operations // link model with texture void AssignTexture( ref<COpenGlTextureIfaceGp> rOpenGlTexture, str sSpriteId) new virtual auto; // select one of the sprite images void SetCurrentSpiteImage( int iSpriteImage) new virtual auto; // move void SetModelLocation( point3d point3dCenter) new virtual auto; // sprite width/height void SetSizeFor2dModel( num numWidth, num numHeight) new virtual auto; // UI protected: private: void _init_AttachToOpenGlModelIfaceGp(); //void cx_BeforeMethod(const DBeforeMethod& dataBeforeMethod); //virtual void OnTestClass(); };
Добавление 3d-модели в сцену делается следующим образом:
void CVesselPointOpenGlImpl::AddNewModelToScene( path pathFileNameWithoutExtension, type<COpenGlMaterialIfaceGp> typeOpenGlMaterial) { // get path to model path pathObfuscated = CVesselPointPaths::GObtainPathToVesselPointModels(); m_rExtra3dCryptoStorage->x_pathStorageFileFull = pathObfuscated; // // do load from file // ref<COpenGlModelIfaceGp> rOpenGlModel = ref<COpenGlModelIfaceGp>()->NewOpenGlModel3d(); rOpenGlModel-> LoadFromRawFile( pathModel, m_rExtra3dCryptoStorage, m_rOpenGl); // set properties rOpenGlModel->x_sModelId = pathFileNameWithoutExtension; rOpenGlModel->AssignMaterial(typeOpenGlMaterial); rOpenGlModel->x_bSelectable = false; // add our model to scene m_rOpenGl->x_rOpenGlScene->AddNewModelToScene(rOpenGlModel); }
Класс CExtra3dCryptoStorageIfaceGp поддерживает кэширование данных. Рекомендуется хранить его экземпляр между сессиями если требуются частые перезагрузки объектов по тем или иным причинам.
На текущий момент 2d-модель представляет из себя простой прямоугольник, на который накладывается текстура.
Добавление 2d-модели в сцену делается следующим образом:
{ // ... // // Init model // m_rOpenGlModel = ref<COpenGlModelIfaceGp>()->NewOpenGlModel2d(); m_rOpenGlModel->AssignTexture(rOpenGlTexture, "IDB_SHT_TGT_BAD"); m_rOpenGlModel->SetModelLocation(point3d(100, 100, 0)); m_rOpenGlModel->SetSizeFor2dModel(64, 64); m_rOpenGl->x_rOpenGlScene->AddNewModelToScene(m_rOpenGlModel); // ...