JunkBox_Win_Lib 1.5.3
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
GlBaseClass.cpp
Go to the documentation of this file.
1//
2// OpenGL用ライブラリ
3//
4
5
6#include "GlBaseClass.h"
7
8
9#ifdef ENABLE_OPENGL
10
11
12using namespace jbxwl;
13
14
16// CGlBaseView for OpenGL
17
18CGlBaseView::CGlBaseView()
19{
20 m_hRC = NULL;
21 m_pDC = NULL;
22
23 ZeroMemory(&glParam, sizeof(PIXELFORMATDESCRIPTOR));
24}
25
26
27//
28CGlBaseView::~CGlBaseView()
29{
30 DEBUG_INFO("DESTRUCTOR: CGlBaseView\n");
31 if (pApp!=NULL) pApp->ViewDestructor(this); // 上位アプリケーションに通知
32}
33
34
35//
36// デバイスのパラメータを設定する.オーバーロード可能.
37//
38void CGlBaseView::SetParameter(PIXELFORMATDESCRIPTOR* param)
39{
40 //DEBUG_ERROR("CGlBaseView::SetParameter\n");
41 //
42 ZeroMemory(param, sizeof(PIXELFORMATDESCRIPTOR));
43 param->nSize = sizeof(PIXELFORMATDESCRIPTOR);
44 param->nVersion = 1;
45 param->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
46 param->iPixelType = PFD_TYPE_RGBA;
47 param->cColorBits = 24;
48 param->cDepthBits = 16;
49 param->iLayerType = PFD_MAIN_PLANE;
50 //
51 colorMode = GRAPH_COLOR_RGBA;
52}
53
54
55//
56BOOL CGlBaseView::InitDevice(int xsize, int ysize, CWnd* cwnd)
57{
58 ::glDepthFunc(GL_LEQUAL);
59 ::glEnable(GL_DEPTH_TEST);
60
61 ::glShadeModel(GL_SMOOTH);
62
63 // Lighting
64// ::glEnable(GL_LIGHTING);
65// ::glEnable(GL_LIGHT0);
66// ::glEnable(GL_LIGHT1);
67
68 SetWindowSize(xsize, ysize);
69
70 return TRUE;
71}
72
73
74//
75// ウィンドウが画面に収まるように大きさを再計算する
76//
77POINT CGlBaseView::GetWindowDisplaySize(POINT pt)
78{
79 int rx = GetSystemMetrics(SM_CXSCREEN); // X方向の解像度
80 int ry = GetSystemMetrics(SM_CYSCREEN) - 14; // Y方向の解像度(-ツールバー)
81
82 int scrSize = Min(rx, ry)*2/3;
83 int sz = Max(pt.x, pt.y);
84 if (sz<=0) return pt;
85
86 double rs = 1.0;
87 if (sz>scrSize) {
88 rs = (double)scrSize/sz;
89 pt.x = (int)(pt.x*rs);
90 pt.y = (int)(pt.y*rs);
91 }
92
93 return pt;
94}
95
96
97
108int CGlBaseView::GetMouseButton()
109{
110 return 0;
111}
112
113
114//
115void CGlBaseView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
116{
117 CExView::OnActivateView(bActivate, pActivateView, pDeactiveView);
118}
119
120
121
122
124//
125
126BEGIN_MESSAGE_MAP(jbxwl::CGlBaseView, CExView)
127 ON_WM_CREATE()
128 ON_WM_DESTROY()
129 ON_WM_SIZE()
130END_MESSAGE_MAP()
131
132
133
134int CGlBaseView::OnCreate(LPCREATESTRUCT lpCreateStruct)
135{
136 if (CExView::OnCreate(lpCreateStruct)==-1) return -1;
137
138 m_pDC = new CClientDC(this);
139 if (m_pDC==NULL) return -1;
140
141 SetParameter(&glParam);
142
143 m_hRC = WGLCreateContext(m_pDC, &glParam);
144 if (m_hRC==NULL) {
145 delete m_pDC;
146 m_pDC = NULL;
147 return -1;
148 }
149
150 return 0;
151}
152
153
154//
155void CGlBaseView::OnDestroy()
156{
157 CExView::OnDestroy();
158
159 WGLDeleteContext(m_hRC);
160
161 if (m_pDC) {
162 delete m_pDC;
163 m_pDC = NULL;
164 }
165}
166
167
168//
169void CGlBaseView::OnSize(UINT nType, int cx, int cy)
170{
171 CExView::OnSize(nType, cx, cy);
172}
173
174
175
177// CGlVTXBaseView クラス
178//
179/*
180
181BEGIN_MESSAGE_MAP(jbxwl::CGlVTXBaseView, CGlBaseView)
182 ON_WM_TIMER()
183END_MESSAGE_MAP()
184
185
186CGlVTXBaseView::CGlVTXBaseView()
187{
188 angleX = angleY = angleZ = 0.0;
189 angle = 0.0;
190 rTime = gTime = 0.0;
191 lTime = 1.0;
192 mWheelAc = 0.0;
193 mWheelNotch = 1.0;
194
195 startTime = (double)timeGetTime();
196}
197
198
199
200CGlVTXBaseView::~CGlVTXBaseView()
201{
202 //DEBUG_INFO("DESTRUCTOR: CGlVTXBaseView\n");
203 if (pApp!=NULL) pApp->ViewDestructor(this); // 上位アプリケーションに通知
204
205 ReleaseVB();
206}
207
208
209
210void CGlVTXBaseView::SwitchRotation()
211{
212 if (rotation) {
213 rotation = false;
214 }
215 else {
216 gTime = rTime = (double)timeGetTime() - startTime;
217 rotation = true;
218 }
219 angleX = angleY = angleZ = 0.0;
220}
221
222
223
224// 回転処理
225// この関数の外で,matTrans(平行移動)が定義されていること.
226// DirectInput は挙動が怪しいので使いたくない....
227//
228void CGlVTXBaseView::ExecRotation()
229{
230 rTime = (double)timeGetTime() - startTime;
231
232 if (rotation) {
233 angle = angle + (rTime - gTime);
234 }
235
236 else {
237 double mwheel = 0.0;
238
239 if (mwheel!=0.0) {
240 mWheelAc = mWheelAc - mWheelNotch*mwheel/2000.f;
241 ExMouseWheel();
242 }
243
244 angle = 0.0;
245 }
246 gTime = rTime;
247
248}
249
250
251
253// 描画
254
255void CGlVTXBaseView::OnTimer(UINT_PTR nIDEvent)
256{
257 if (hasViewData) {
258 if (doReSize) ExecWindowReSize(clientRect.right, clientRect.bottom);
259 else ExecRotation();
260 ExecRender();
261 }
262 else DEBUG_ERROR("CGlVTXBaseView::OnTimer(): ERROR: 表示可能なデータがありません\n");
263 CGlBaseView::OnTimer(nIDEvent);
264}
265
266
267
268void CGlVTXBaseView::OnDraw(CDC* pDC)
269{
270 if (hasViewData && timerID==-1) {
271 if (doReSize) ExecWindowReSize(clientRect.right, clientRect.bottom);
272 else ExecRotation();
273 ExecRender();
274 }
275 else if (!hasViewData) DEBUG_ERROR("CGlVTXBaseView::OnDraw(): ERROR: 表示可能なデータがありません\n");
276}
277
278*/
279
280
281#endif // ENABLE_OPENGL