leaky-pool/client/main.go

127 lines
3.5 KiB
Go

package main
import (
"log"
"strconv"
"time"
"github.com/g3n/engine/app"
"github.com/g3n/engine/camera"
"github.com/g3n/engine/core"
"github.com/g3n/engine/geometry"
"github.com/g3n/engine/gls"
"github.com/g3n/engine/graphic"
"github.com/g3n/engine/gui"
"github.com/g3n/engine/light"
"github.com/g3n/engine/material"
"github.com/g3n/engine/math32"
"github.com/g3n/engine/renderer"
"github.com/g3n/engine/util/helper"
"github.com/g3n/engine/window"
)
func main() {
// Create application and scene
a := app.App(1920, 1080, "Leaky Pool")
scene := core.NewNode()
// Set the scene to be managed by the gui manager
gui.Manager().Set(scene)
// Create perspective camera
cam := camera.New(1)
cam.SetPosition(0, 0, 80)
scene.Add(cam)
// Set up orbit control for the camera
camera.NewOrbitControl(cam)
// Set up callback to update viewport and camera aspect ratio when the window is resized
onResize := func(evname string, ev interface{}) {
// Get framebuffer size and update viewport accordingly
width, height := a.GetSize()
a.Gls().Viewport(0, 0, int32(width), int32(height))
// Update the camera's aspect ratio
cam.SetAspect(float32(width) / float32(height))
}
a.Subscribe(window.OnWindowSize, onResize)
onResize("", nil)
// Create a blue torus and add it to the scene
geom := geometry.NewTorus(1, .4, 12, 32, math32.Pi*2)
mat := material.NewStandard(math32.NewColor("DarkBlue"))
mesh := graphic.NewMesh(geom, mat)
scene.Add(mesh)
// Create and add lights to the scene
scene.Add(light.NewAmbient(&math32.Color{1.0, 1.0, 1.0}, 0.8))
pointLight := light.NewPoint(&math32.Color{1, 1, 1}, 5.0)
pointLight.SetPosition(1, 0, 2)
scene.Add(pointLight)
// Create and add an axis helper to the scene
scene.Add(helper.NewAxes(0.5))
// Set background color to gray
//a.Gls().ClearColor(0.5, 0.5, 0.5, 1.0)
a.Gls().ClearColor(0, 0, 0, 1.0)
///////
//GUI//
///////
labelServer := gui.NewLabel("Server: ")
labelServer.SetPosition(10, 8)
scene.Add(labelServer)
editServer := gui.NewEdit(150, "10.69.71.106:6699")
editServer.SetText("10.69.71.106:6699")
editServer.SetPosition(labelServer.Position().X+labelServer.Width()+10, 10)
scene.Add(editServer)
labelPoolSize := gui.NewLabel("Pool Size: ")
labelPoolSize.SetPosition(editServer.Position().X+editServer.Width()+10, 8)
scene.Add(labelPoolSize)
editPoolSize := gui.NewEdit(30, "10")
editPoolSize.SetText("10")
editPoolSize.SetPosition(labelPoolSize.Position().X+labelPoolSize.Width()+10, 10)
scene.Add(editPoolSize)
buttonConnect := gui.NewButton("Start Pool")
buttonConnect.SetPosition(editPoolSize.Position().X+editPoolSize.Width()+10, 8)
buttonConnect.Subscribe(gui.OnClick, func(name string, ev interface{}) {
poolSize, err := strconv.Atoi(editPoolSize.Text())
if err != nil {
log.Printf("failed to convert poolSize '%d' to integer: %v", poolSize, err)
return
}
go connPoolWatchdog(editServer.Text(), poolSize, scene) // goroutine that keeps the pool full of healthy TCP connections
buttonConnect.Label.SetText("Stop Pool") // stop not implemented
})
scene.Add(buttonConnect)
// Create and add a button to the scene
btn := gui.NewButton("Make Red")
btn.SetPosition(100, 40)
btn.SetSize(40, 40)
btn.Subscribe(gui.OnClick, func(name string, ev interface{}) {
mat.SetColor(math32.NewColor("DarkRed"))
})
scene.Add(btn)
// Run the application
a.Run(func(renderer *renderer.Renderer, deltaTime time.Duration) {
a.Gls().Clear(gls.DEPTH_BUFFER_BIT | gls.STENCIL_BUFFER_BIT | gls.COLOR_BUFFER_BIT)
renderer.Render(scene, cam)
})
}