diff options
| -rw-r--r-- | app.go | 13 | ||||
| -rw-r--r-- | geometry.go | 47 | ||||
| -rw-r--r-- | main.go | 2 | 
3 files changed, 56 insertions, 6 deletions
| @@ -18,11 +18,14 @@ const (  type App struct {  	window *glfw.Window  	graphics *Graphics +	stl *StlModel +	homeTrafo mgl32.Mat4  } -func newApp() App { +func newApp(stl *StlModel) App {  	var app App = App{} +	app.stl = stl  	var err error  	log.Println("GLFW init") @@ -44,6 +47,8 @@ func newApp() App {  	}  	app.window.MakeContextCurrent() +	app.homeTrafo = stl.surface.getHomeView() +  	return app  } @@ -52,10 +57,8 @@ func (application *App) handle() {  	application.window.SwapBuffers()  	// generate and set transformation -	var scale float32 = 0.01 -	trafo := mgl32.Ident4() -	trafo = trafo.Mul4(mgl32.HomogRotate3D(float32(glfw.GetTime()) * 3, mgl32.Vec3{0, 1, 1})) -	trafo = trafo.Mul4(mgl32.Scale3D(scale, scale, scale)) +	trafo := application.homeTrafo +	trafo = mgl32.HomogRotate3D(float32(glfw.GetTime()) * 3, mgl32.Vec3{0, 1, 0}).Mul4(trafo)  // apply time-based rotation  	application.graphics.setTrafo(trafo)  } diff --git a/geometry.go b/geometry.go index 04896dc..1fc516a 100644 --- a/geometry.go +++ b/geometry.go @@ -2,6 +2,10 @@  package main +import ( +	"github.com/go-gl/mathgl/mgl32" +) +  // representation of a three-dimensional point in space  type Point struct {  	scalars [3]float32  // x = scalars[0], y = scalars[1], z = scalars[2] @@ -17,3 +21,46 @@ type Surface struct {  	triangles []*Triangle  } +// return a transformation to view the whole centered surface +func (s Surface) getHomeView() mgl32.Mat4 { + +	// evaluating the smallest and biggest values for x,y,z of the surface +	var min,max [3]float32 +	for _,triangle := range(s.triangles) { +		for _,point := range(triangle.points) { +			for index,_ := range(min) { +				if point.scalars[index] < min[index] { +					min[index] = point.scalars[index] +				} +				if point.scalars[index] > max[index] { +					max[index] = point.scalars[index] +				} +			} +		} +	} + +	// calculate center point +	var center Point +	for index,_ := range(min) { +		center.scalars[index] = (min[index] + max[index]) / 2 +	} + +	// calculate zoom +	var zoom,zoomX,zoomY float32 +	const fillFactor float32 = 0.8 +	zoomX = (2 / (max[0] - min[0])) * fillFactor +	zoomY = (2 / (max[1] - min[1])) * fillFactor +	if zoomX > zoomY { +		zoom = zoomY +	} else { +		zoom = zoomX +	} + +	// calculate and return transformation +	var trafo mgl32.Mat4 = mgl32.Ident4() +	trafo = mgl32.Translate3D(-center.scalars[0], -center.scalars[1], -center.scalars[2]).Mul4(trafo) +	trafo = mgl32.Scale3D(zoom, zoom, zoom).Mul4(trafo) + +	return trafo +} + @@ -28,7 +28,7 @@ func main() {  	vertices = stl.toVertices()  	// initialize application (includes GLFW/window) -	var app App = newApp() +	var app App = newApp(&stl)  	defer app.terminate()  // GLFW needs to be terminated!  	// initialize graphics | 
