TornadoFX и OpenGL - PullRequest
       23

TornadoFX и OpenGL

0 голосов
/ 17 октября 2019

Я хочу использовать TornadoFX для создания модального окна, которое отображает графику OpenGL. Я никогда не пробовал это в JavaFX, но в этом посте говорится, что возможно использование SwingNode в JavaFX. В этом SO * сообщении показано, что кто-то использует swingnode в TornadoFX, но когда я пытаюсь получить сообщение об ошибке unresolved reference: swingnode, возможно, оно больше не поддерживается?

1 Ответ

0 голосов
/ 17 октября 2019

Для тех, кто хочет добавить OpenGL в TornadoFX, как я, мне удалось сделать это с помощью следующего кода, используя SwingNode.

Для этого вам понадобятся зависимости JOGL 2.3.2.

import com.jogamp.opengl.*
import com.jogamp.opengl.awt.GLJPanel
import com.jogamp.opengl.glu.GLU
import javafx.embed.swing.SwingNode
import tornadofx.*

class GraphicsView : View("Graphics") {

    override val root = stackpane {

    }

    init {

        val swingNode = SwingNode()
        val glprofile = GLProfile.get(GLProfile.GL2)
        val glcapabilities = GLCapabilities(glprofile)

        val gljpanel = GLJPanel(glcapabilities)

        val obj = object : GLEventListener {

            override fun reshape(glautodrawable: GLAutoDrawable, x: Int, y: Int, width: Int, height: Int) {

                val gl2 = glautodrawable.getGL().getGL2()

                gl2.glMatrixMode(GL2.GL_PROJECTION)
                gl2.glLoadIdentity()

                // coordinate system origin at lower left with width and height same as the window
                val glu = GLU()
                glu.gluOrtho2D(0.0f, width.toFloat(), 0.0f, height.toFloat())

                gl2.glMatrixMode(GL2.GL_MODELVIEW)
                gl2.glLoadIdentity()

                gl2.glViewport(0, 0, width, height)
            }

            override fun init(glautodrawable: GLAutoDrawable) {

            }

            override fun dispose(glautodrawable: GLAutoDrawable) {

            }

            override fun display(glautodrawable: GLAutoDrawable) {

                val width = 500
                val height = 500

                val gl2 = glautodrawable.getGL().getGL2()

                gl2.glClear(GL.GL_COLOR_BUFFER_BIT)

                // draw a triangle filling the window
                gl2.glLoadIdentity()
                gl2.glBegin(GL.GL_TRIANGLES)
                gl2.glColor3f(1f, 0f, 0f)
                gl2.glVertex2f(0f, 0f)
                gl2.glColor3f(0f, 1f, 0f)
                gl2.glVertex2f(width.toFloat(), 0f)
                gl2.glColor3f(0f, 0f, 1f)
                gl2.glVertex2f((width / 2).toFloat(), height.toFloat())
                gl2.glEnd()
            }
        }

        gljpanel.addGLEventListener(obj)

        swingNode.content = gljpanel

        root.children.add(swingNode)
    }
}
...