• MFC加载osg模型


    创建MFC单文档项目,

    OSGObject.h

    #pragma once
    #include <osgViewerViewer>
    #include <osgDBReadFile>
    #include <osgViewerapiWin32GraphicsWindowWin32>
    #include <osgGATrackballManipulator>
    
    #include <osgGroup>
    
    class COSGObject
    {
    public:
        COSGObject(HWND hWnd);
        ~COSGObject();
    
        void InitOSG();
        void InitSceneGraph();
        void InitCameraConfig();
        void PreFrameUpdate();
        void PostFrameUpdate();
        static void Render(void* ptr);
    
        osgViewer::Viewer* getOsgViewer();
    
    private:
        HWND m_hwnd;
        osgViewer::Viewer* mViewer;
        osg::ref_ptr<osg::Group> mRoot;
    };

    OSGObject.cpp

    #pragma once
    #include <osgViewerViewer>
    #include <osgDBReadFile>
    #include <osgViewerapiWin32GraphicsWindowWin32>
    #include <osgGATrackballManipulator>
    
    #include <osgGroup>
    
    class COSGObject
    {
    public:
        COSGObject(HWND hWnd);
        ~COSGObject();
    
        void InitOSG();
        void InitSceneGraph();
        void InitCameraConfig();
        void PreFrameUpdate();
        void PostFrameUpdate();
        static void Render(void* ptr);
    
        osgViewer::Viewer* getOsgViewer();
    
    private:
        HWND m_hwnd;
        osgViewer::Viewer* mViewer;
        osg::ref_ptr<osg::Group> mRoot;
    };

    View.h

    // 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
    // (“Fluent UI”)。该示例仅供参考,
    // 用以补充《Microsoft 基础类参考》和 
    // MFC C++ 库软件随附的相关电子文档。  
    // 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
    // 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
    // http://go.microsoft.com/fwlink/?LinkId=238214//
    // 版权所有(C) Microsoft Corporation
    // 保留所有权利。
    
    // View.h : View 类的接口
    //
    
    #pragma once
    #include "Doc.h"
    #include "OSGObject.h"
    
    class View : public CView
    {
    protected: // 仅从序列化创建
        CMFC_OsgEarth20190901View();
        DECLARE_DYNCREATE(View)
    
    // 特性
    public:
        Doc* GetDocument() const;
    
    // 操作
    public:
        COSGObject* mOsgObj;
        HANDLE mThreadHandle;
    
    // 重写
    public:
        virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
        virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    
    // 实现
    public:
        virtual ~View();
    #ifdef _DEBUG
        virtual void AssertValid() const;
        virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // 生成的消息映射函数
    protected:
        afx_msg void OnFilePrintPreview();
        afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
        afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
        DECLARE_MESSAGE_MAP()
    public:
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        afx_msg BOOL OnEraseBkgnd(CDC* pDC);
        afx_msg void OnDestroy();
        virtual void OnInitialUpdate();
    };
    
    #ifndef _DEBUG  // View.cpp 中的调试版本
    inline Doc* View::GetDocument() const
       { return reinterpret_cast<Doc*>(m_pDocument); }
    #endif

    View.cpp

    // 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 
    // (“Fluent UI”)。该示例仅供参考,
    // 用以补充《Microsoft 基础类参考》和 
    // MFC C++ 库软件随附的相关电子文档。  
    // 复制、使用或分发 Fluent UI 的许可条款是单独提供的。  
    // 若要了解有关 Fluent UI 许可计划的详细信息,请访问 
    // http://go.microsoft.com/fwlink/?LinkId=238214//
    // 版权所有(C) Microsoft Corporation
    // 保留所有权利。
    
    // View.cpp : View 类的实现
    //
    
    #include "stdafx.h"
    // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
    // ATL 项目中进行定义,并允许与该项目共享文档代码。
    #ifndef SHARED_HANDLERS
    #endif
    
    #include "Doc.h"
    #include "View.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // View
    
    IMPLEMENT_DYNCREATE(View, CView)
    
    BEGIN_MESSAGE_MAP(View, CView)
        ON_WM_CONTEXTMENU()
        ON_WM_RBUTTONUP()
        ON_WM_CREATE()
        ON_WM_ERASEBKGND()
        ON_WM_DESTROY()
    END_MESSAGE_MAP()
    
    // View 构造/析构
    
    View::View()
    {
        // TODO: 在此处添加构造代码
        mOsgObj = 0;
        mThreadHandle = 0;
    }
    
    View::~View()
    {
    }
    
    BOOL View::PreCreateWindow(CREATESTRUCT& cs)
    {
        // TODO: 在此处通过修改
        //  CREATESTRUCT cs 来修改窗口类或样式
    
        return CView::PreCreateWindow(cs);
    }
    
    // View 绘制
    
    void View::OnDraw(CDC* /*pDC*/)
    {
        Doc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        if (!pDoc)
            return;
    
        // TODO: 在此处为本机数据添加绘制代码
    }
    
    void View::OnRButtonUp(UINT /* nFlags */, CPoint point)
    {
        ClientToScreen(&point);
        OnContextMenu(this, point);
    }
    
    void View::OnContextMenu(CWnd* /* pWnd */, CPoint point)
    {
    #ifndef SHARED_HANDLERS
        //theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
    #endif
    }
    
    
    // View 诊断
    
    #ifdef _DEBUG
    void View::AssertValid() const
    {
        CView::AssertValid();
    }
    
    void View::Dump(CDumpContext& dc) const
    {
        CView::Dump(dc);
    }
    
    Doc* View::GetDocument() const // 非调试版本是内联的
    {
        ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Doc)));
        return (Doc*)m_pDocument;
    }
    #endif //_DEBUG
    
    
    // View 消息处理程序
    
    
    int View::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CView::OnCreate(lpCreateStruct) == -1)
            return -1;
    
        // TODO:  在此添加您专用的创建代码
        mOsgObj = new COSGObject(m_hWnd);
    
    
        return 0;
    }
    
    
    BOOL View::OnEraseBkgnd(CDC* pDC)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        if (0 == mOsgObj)
        {
            return CView::OnEraseBkgnd(pDC);
        }
        else 
        {
            return FALSE;
        }
        return CView::OnEraseBkgnd(pDC);
    }
    
    
    void View::OnDestroy()
    {
        CView::OnDestroy();
    
        // TODO: 在此处添加消息处理程序代码
        if (mOsgObj != 0)
        {
            delete mOsgObj;
        }
        WaitForSingleObject(mThreadHandle, 1000);
    }
    
    
    void View::OnInitialUpdate()
    {
        CView::OnInitialUpdate();
    
        // TODO: 在此添加专用代码和/或调用基类
        mOsgObj->InitOSG();
        mThreadHandle = (HANDLE)_beginthread(&COSGObject::Render, 0, mOsgObj);
    
    }

  • 相关阅读:
    Scrum:The Definition of Done —— 作业有没有写完呢?
    中兴通讯 可视化devops 牛啊 屠亚奇
    qunar-dns
    通过业务系统的重构实践DDD
    通过业务系统的重构实践DDD
    一键部署Kubernetes高可用集群
    springboot系列
    Ubuntu · Docker —— 从入门到实践
    容器化操作系统概览
    基于 CentOS7 的 Kubernetes 集群
  • 原文地址:https://www.cnblogs.com/herd/p/11443026.html
Copyright © 2020-2023  润新知