VBAでOpenGL mouse button

sponsored

いまさらの感もありますが、VBAからOpenGLを使うことに挑戦です。
VBAからOpenGLを使うための参考はこちら。GDIの資料もありました。
OpenGLのサンプルはこちら。今回はマウスのクリック操作で線画とポリゴン描画を切り替えるというものです。元のコードは次のとおり。

#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>

const GLfloat vertex[] = { -0.9 , 0.9 , 0.9 , 0.9 , 0 , -0.9 };
GLboolean isLine = GL_FALSE;

void disp( void ) {
glClear(GL_COLOR_BUFFER_BIT);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2 , GL_FLOAT , 0 , vertex);
glDrawArrays((isLine == GL_TRUE ? GL_LINE_LOOP : GL_POLYGON) , 0 , 3);

glFlush();
}

void mouse(int button , int state , int x , int y) {
if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN) return;
isLine = (isLine == GL_TRUE ? GL_FALSE : GL_TRUE);
glutPostRedisplay();
}

int main(int argc , char ** argv) {
glutInit(&argc , argv);
glutInitWindowPosition(100 , 50);
glutInitWindowSize(400 , 300);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

glutCreateWindow("Kitty on your lap");
glutDisplayFunc(disp);
glutMouseFunc(mouse);

glutMainLoop();
return 0;
}

これをVBAに置き換えます。

Private Sub Testmouse()
'Private Sub Workbook_Open()
mousemain
End Sub

OpenGLの処理を呼び出すための関数です。

本体は次のようになります。
GLFloatは、VBAのSingleで置き換えます。
マウス操作の結果が入る整数の引き数はLong型で、値渡しです。

Public vertex(6) As Single
Public isLine As Long

Public Sub disp()
Call glClear(GL_COLOR_BUFFER_BIT)

Call glEnableClientState(GL_VERTEX_ARRAY)
Call glVertexPointer(2, GL_FLOAT, 0, vertex(1))
If isLine = GL_TRUE Then
Call glDrawArrays(GL_LINE_LOOP, 0, 3)
Else
Call glDrawArrays(GL_POLYGON, 0, 3)
End If
Call glFlush
End Sub

Public Sub mouse(ByVal button As Long, ByVal state As Long, ByVal x As Long, ByVal y As Long)
If (button = GLUT_LEFT_BUTTON And state = GLUT_DOWN) Then
' isLine = (isLine == GL_TRUE ? GL_FALSE : GL_TRUE);
Debug.Print "Click!"
If (isLine = GL_TRUE) Then
isLine = GL_FALSE
Debug.Print "isLine", isLine
Else
isLine = GL_TRUE
Debug.Print "isLine", isLine
End If

End If
Call glutPostRedisplay
End Sub

Function mousemain() '(int argc , char ** argv) {
' GLfloat vertex[] = { -0.9 , 0.9 , 0.9 , 0.9 , 0 , -0.9 };
' #GLboolean isLine = GL_FALSE

Call BuildArray(vertex, Array(-0.9, 0.9, 0.9, 0.9, 0, -0.9))
isLine = GL_FALSE
' Chargement de freeglut
If Not LoadFreeGlut(ThisWorkbook.Path) Then
MsgBox "Impossible de charger la librairie freeglut"
Exit Function
End If
Call glutInit(0&, "")
Call glutInitWindowPosition(100, 50)
Call glutInitWindowSize(400, 300)
Call glutInitDisplayMode(GLUT_SINGLE Or GLUT_RGBA)
glutSetOption GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS

Call glutCreateWindow("Kitty on your lap")
Call glutDisplayFunc(AddressOf disp)
Call glutMouseFunc(AddressOf mouse)

Call glutMainLoop
End Function

本体は標準モジュール内に置きました。

実行結果です。ウインド上で左ボタンをクリックすると描画が切り替わりました。

コメント

タイトルとURLをコピーしました