Using the Window3D class
From Solid Graphics Wiki
This article discuss various scenarios of using the Window3D class.
Contents |
Using the Window3D class in MFC applications
Use C3DView class or C3DWindow class to use Window3D class features in MFC applications. These classes are derived from the Window3D class and implemented in SklMFC.h and SklMFC.cpp. Include the SklMFC.h and SklMFC.cpp files into the MFC application's project and compile them with the rest of the project source code files.
You can use the CreateProject tool included with the SolidKit Library to create initial version of your MFC project using MFC_MDI_Template or MFC_SDI_Template project (included in the SolidKit Library sample projects) as template.
Using the Window3D class with a window not created by any of the SolidKit library functions
If the window is created by some other framework and you want to use the Window3D class features in such window then you need to pass handling of the window's WM_CREATE, WM_DESTROY, WM_SIZE, WM_ERASEBKGND, WM_SETFOCUS, WM_KILLFOCUS, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL messages to the corresponding Window3D::OnWindow3D* message handlers. The WM_PAINT message must call Window3D::RenderBegin and Window3D::RenderEnd functions and the scene should be rendered between these two function calls. An example of such implementation are actually the C3DView and C3DWindow classes implemented in the SklMFC.h and SklMFC.cpp files
Using the Window3D class to create 3D view navigation window
If the application uses the Window::Create method to create a window for 3D scene navigation, then writing such application involves these steps:
- derive a class from the Window3D class and override the DrawScene virtual function. You can also override the InitializeRenderingContextState function to provide custom rendering context state (such as lighting, texture modes etc) initialization.
- implement your scene rendering into the overrided DrawScene function.
- call Window::Create method on the derived class object's to create the 3D view navigation window, or if the derived class instance is supposed to be main application window then provide the instance as mainWindow parameter to the WindowsApplication::Run method (this also involves overriding the Window::ProcessWindowMessage function to implement main-window-specific handling of the window messages).
See SKL_3DGUI_Template SolidKit Library's project for example of such application.
Using the Window3D class for off-screen rendering
Call Window3D::CreateOffScreenWindow to create off-screen rendering context. Such context is most often used in programs which do no have graphics interface such as console applications or services.
Example of creating off-screen window, rendering a cube into it and saving rendered image into JPEG file
SKL3D::Window3D view; SKL3D::Shape shape; SKL3D::VectorList shapeNormals; SKL3D::ObjectPosInfo objectPosInfo ( SKL3D::cOrigin, // shape's position SKL3D::Vector( 30.0f, -20.0f, -10.0f ) // shape's rotation ); // create (Box) shape and calculate it's normals shape.CreateBox( 2.0f, 2.0f, 2.0f ); shape.CalculateNormals( shapeNormals, SKL3D::Flat ); // create 800x600 pixels sized off-screen (memory based) window view.CreateOffScreenWindow( 800, 600 ); view.SetEyePoint( SKL3D::Point( 0.0f, 0.0f, 5.0f ), true ); view.RenderBegin(); SKL3D::DepthTestOn depthTestOn; SKL3D::LightingOn lightingOn; SKL3D::LightOn lightOn; SKL3D::Material::Brass.Apply(); // render scene objectPosInfo.ObjectToWorldOGL(); // set object's position SKL3D::DrawFlatShadedShape( shape, shapeNormals ); view.RenderEnd(); // save result to Screenshot.jpg file view.SaveScreenShot( "Screenshot.jpg", true );
The above code is similar to code in the Console_Template sample application.
