OpenGL Lib Сцена и Модели

  !   Данная информация предназначена только только для 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-модели

Добавление 3d-модели в сцену делается следующим образом:

  • создать новый объект COpenGlModelIfaceGp, выбрав соответствующий метод
  • загрузить данные из файла
  • установить прочие параметры для модели
    • рекомендуется устанавливать rOpenGlModel->x_sModelId для удобства отладки
  • добавить модель к сцене
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-модель представляет из себя простой прямоугольник, на который накладывается текстура.

Добавление 2d-модели в сцену делается следующим образом:

  • создать новый объект COpenGlModelIfaceGp, выбрав соответствующий метод
  • задать положение модели в пространстве
  • задать текстуру для модели
  • добавить модель к сцене
{
    // ...
 
    //
    // 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);
 
    // ...