#Region Project Attributes
#MainFormWidth: 920
#MainFormHeight: 720
#End Region
Sub Process_Globals
Private fx As JFX
Private MainForm As Form
Private Universe As JavaObject
Private Canvas3D As JavaObject
' Private Scene As JavaObject
Private BranchGroup As JavaObject
Private TransformGroup As JavaObject
Private OrbitBehavior As JavaObject
Private VirtualUniverse As JavaObject
Private Locale As JavaObject
Private ViewPlatform As JavaObject
Private JCanvas3D As JavaObject
Private GraphicsConfigTemplate3D As JavaObject
Private Transform3D As JavaObject
Private TransformGroup As JavaObject
Private DirectionalLight As JavaObject
Private Point3d As JavaObject
' Private Point3f As JavaObject
Private Vector3d As JavaObject
Private Vector3f As JavaObject
Private Color3f As JavaObject
Private j3dView As JavaObject
Private j3dPhysicalBody As JavaObject
Private j3dPhysicalEnvironment As JavaObject
Private SwingNode As JavaObject ' SWING NODE TO PUT A SWING CONTROL ON JFX FORM. ON THIS CODE WE USE A JPANEL COMPONENT
Private jPanel As JavaObject
Private BorderLayout As JavaObject
' Geometries
Private ColorCube As JavaObject ' Our colored cube
Private Sphere As JavaObject
Private Bounds As JavaObject
Private BoundingSphere As JavaObject
'Private LightIsOff As Boolean = True
Private Dimension As JavaObject
End Sub
Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.Show
Dim LibPath As String = GetSystemProperty("java.library.path", "")
Log("Java library path: " & LibPath)
Dim LibPathes() As String = Regex.Split(";", LibPath)
For Each s As String In LibPathes
Log("On java.library.path: " & s)
Next
Log("sun.awt.noerasebackground [before] write it: " & GetSystemProperty("sun.awt.noerasebackground", "false"))
SetSystemProperty("sun.awt.noerasebackground", "true") ' Use this if you have problems while resize the 3D view
Log("sun.awt.noerasebackground [after] write it: " & GetSystemProperty("sun.awt.noerasebackground", "false"))
SwingNode.InitializeNewInstance("javafx.embed.swing.SwingNode", Null) ' Create a SwingNode
BorderLayout.InitializeNewInstance("java.awt.BorderLayout", Null) ' Create a BorderLayout to put the JPanel
jPanel.InitializeNewInstance("javax.swing.JPanel", Null) ' Create a JPanel
jPanel.RunMethod("setLayout", Array (BorderLayout)) ' Set a BorderLayout on JPanel
Dimension.InitializeNewInstance("java.awt.Dimension", Array(900, 700))
jPanel.RunMethod("setPreferredSize", Array(Dimension))
'
' Dim component As JavaObject
' component.InitializeStatic("java.awt.Component")
' component = MakeCanvas
' jp1.InitializeNewInstance("javax.swing.JPanel", Null) ' Create a JPanel
' jp1 = MakeCanvas
' jp1.RunMethod("setLayout", Array (BorderLayout)) ' Set a BorderLayout on JPanel
'' Dimension.InitializeNewInstance("java.awt.Dimension", Array(900, 700))
' jp1.RunMethod("setPreferredSize", Array(Dimension))
Dim Alignment As Object = BorderLayout.GetField("CENTER")' Get the CENTER field
jPanel.RunMethod("add", Array (MakeCanvas, Alignment)) ' Put the Canvas3D inside a JPanel with CENTER alignment
SwingNode.RunMethod("setContent", Array(jPanel)) ' Set JPanel as SwingNode content
MainForm.RootPane.AddNode(SwingNode, 10, 10, 900, 680) ' Finally we add the SwingNode to MainForm
End Sub
'Return true to allow the default exceptions handler to handle the uncaught exception.
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
Return True
End Sub
Sub MainForm_Resize (Width As Double, Height As Double)
Dim W As Int = Width - 20
Dim H As Int = Height - 40
Log($"Form size: ${Width} X ${Height} 3D View bounds: 10, 10, ${W},${H}"$)
Canvas3D.RunMethod("setBounds", Array (10, 10, W, H))
Dim j1 As JavaObject
Dim Rect As JavaObject = j1.InitializeNewInstance("java.awt.Rectangle",Null)
Canvas3D.RunMethod("getBounds", Array(Rect))
Dim rX As Int = Rect.RunMethod("getX", Null)
Dim rY As Int = Rect.RunMethod("getY", Null)
Dim rW As Int = Rect.RunMethod("getWidth", Null)
Dim rH As Int = Rect.RunMethod("getHeight", Null)
Log($"New bounds read from Canvas3D: ${rX}, ${rY}, ${rW}, ${rH}"$)
End Sub
Sub MakeCanvas As JavaObject
Log("MakeCanvas")
GraphicsConfigTemplate3D.InitializeNewInstance("javax.media.j3d.GraphicsConfigTemplate3D", Null)
JCanvas3D.InitializeNewInstance("com.sun.j3d.exp.swing.JCanvas3D", Array (GraphicsConfigTemplate3D))
' Dim canvasDim AS JavaObject = Dimension.InitializeNewInstance("java.awt.Dimension", Array(900, 700))
Dimension.InitializeNewInstance("java.awt.Dimension", Array(500, 500))
JCanvas3D.RunMethod("setPreferredSize", Array (Dimension))
JCanvas3D.RunMethod("setSize", Array (Dimension))
BorderLayout.InitializeNewInstance("java.awt.BorderLayout", Null) ' Create a BorderLayout to put the JPanel
Dim jp1 As JavaObject
jp1.InitializeNewInstance("javax.swing.JPanel", Null) ' Create a JPanel
''' jPanel.RunMethod("setLayout", Array (BorderLayout)) ' Set a BorderLayout on JPanel
''' ' jPanel.RunMethod("setBounds", Array (10, 10, 300, 300)) ' Resize the JPanel ???
''' jPanel.RunMethod("add", Array (Canvas3D, Alignment)) ' Put the Canvas3D inside a JPanel with CENTER alignment
Dim Alignment As Object = BorderLayout.GetField("CENTER")' Get the CENTER field
jp1.RunMethod("add", Array (JCanvas3D, Alignment))
' I've added this because sometime Java3D fails to initialize the 3D engine, not sure
' if it is necessary or need to be fixed other ways, I've found that the fail depends
' on JCanvas3D size, 500x500 works, bigger fails, this not good, with normal Canvas3D
' it can go up 1920x1200 without problems at all.
Dim jo1 As JavaObject
jo1.InitializeStatic("sun.awt.AppContext")
Dim context As Object = jo1.RunMethod("getAppContext", Null)
If context = Null Then
Dim newcontext As JavaObject
newcontext.InitializeStatic("sun.awt.SunToolkit")
newcontext.RunMethod("createNewAppContext", Null)
End If
'''''''''''''''
Canvas3D = JCanvas3D.RunMethod("getOffscreenCanvas3D", Null)
j3dView.InitializeNewInstance("javax.media.j3d.View", Null)
j3dPhysicalBody.InitializeNewInstance("javax.media.j3d.PhysicalBody", Null)
j3dPhysicalEnvironment.InitializeNewInstance("javax.media.j3d.PhysicalEnvironment", Null)
j3dView.RunMethod("setPhysicalBody", Array (j3dPhysicalBody))
j3dView.RunMethod("setPhysicalEnvironment", Array (j3dPhysicalEnvironment))
j3dView.RunMethod("addCanvas3D", Array (Canvas3D))
Dim vp As JavaObject = ViewPlatform.InitializeNewInstance("javax.media.j3d.ViewPlatform", Null)
j3dView.RunMethod("attachViewPlatform", Array (ViewPlatform))
Dim viewTransform As JavaObject = Transform3D.InitializeNewInstance("javax.media.j3d.Transform3D", Null)
Vector3d.InitializeNewInstance("javax.vecmath.Vector3d", Array (0.0, 0.0, 20.0)) ' Move "back" a little
viewTransform.RunMethod("setTranslation", Array (Vector3d))
Dim viewTG As JavaObject = TransformGroup.InitializeNewInstance("javax.media.j3d.TransformGroup", Null)
Dim Capability As Object = viewTG.GetField("ALLOW_TRANSFORM_WRITE")
viewTG.RunMethod("setCapability", Array (Capability))
viewTG.RunMethod("setTransform", Array (viewTransform))
viewTG.RunMethod("addChild", Array (vp))
' Add light
Dim light As JavaObject = MakeLight
viewTG.RunMethod("addChild", Array (light))
' Add a sphere shape
Dim radius As Float = 5.0
Dim sph As JavaObject = Sphere.InitializeNewInstance("com.sun.j3d.utils.geometry.Sphere", Array (radius))
viewTG.RunMethod("addChild", Array (sph))
Dim group As JavaObject = BranchGroup.InitializeNewInstance("javax.media.j3d.BranchGroup", Null)
group.RunMethod("addChild", Array (viewTG))
' group.RunMethod("addChild", Array (Light)) ' From original java code this seem not right, we already added lights to the group
' group.RunMethod("addChild", Array (Sphere)) ' From original java code this seem not right, we already added a sphere to the group
Dim vu As JavaObject = VirtualUniverse.InitializeNewInstance("javax.media.j3d.VirtualUniverse", Null)
Dim loc As JavaObject = Locale.InitializeNewInstance("javax.media.j3d.Locale", Array(vu))
loc.RunMethod("addBranchGraph", Array (group))
Return jp1
End Sub
Sub MakeLight As JavaObject
Dim jCol As JavaObject
jCol.InitializeStatic("java.awt.Color")
Dim awtColor As Object = jCol.GetField("WHITE") ' RED
Dim color As JavaObject = Color3f.InitializeNewInstance("javax.vecmath.Color3f", Array(awtColor))
Dim x As Float = -1.0
Dim y As Float = -1.0
Dim z As Float = -1.0
Dim position As JavaObject = Vector3f.InitializeNewInstance("javax.vecmath.Vector3f", Array(x, y, z))
Dim light As JavaObject = DirectionalLight.InitializeNewInstance("javax.media.j3d.DirectionalLight", Array(color, position))
Dim BSpherePos As JavaObject = Point3d.InitializeNewInstance("javax.vecmath.Point3d", Array(0.0, 0.0, 0.0))
Dim BSphere As JavaObject = BoundingSphere.InitializeNewInstance("javax.media.j3d.BoundingSphere", Array(BSpherePos, 100.0))
light.RunMethod("setInfluencingBounds", Array (BSphere))
Return light
End Sub