package main import ( "flag" "image" "log" "os" "renderer1/hrend" "runtime/pprof" // For performance profiling (unnecessary) _ "image/jpeg" rl "github.com/gen2brain/raylib-go/raylib" ) const ( Width = 640 Height = 480 NearClip = 0.1 FarClip = 100 FOV = 90.0 ZOffset = -1.5 ObjectFile = "head.obj" TextureFile = "../head.jpg" ) func must(err error) { if err != nil { panic(err) } } func loadDefault() (*hrend.ObjModel, hrend.Framebuffer) { log.Printf("Loading obj %s, texture %s", ObjectFile, TextureFile) of, err := os.Open(ObjectFile) must(err) defer of.Close() o, err := hrend.ParseObj(of) must(err) jf, err := os.Open(TextureFile) must(err) defer jf.Close() timg, _, err := image.Decode(jf) must(err) texture := hrend.NewTexture(timg, 4) return o, texture } // However flag works... idk var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") // var dozbuf = flag.Bool("zbuffer", false, "Write zbuffer instead of image") // var p6file = flag.String("p6file", "", "Output binary ppm to given file instead") // var fov = flag.Float64("fov", 90, "Horizontal FOV in degrees") // var xofs = flag.Float64("xofs", 0, "Offset image by x") // var zofs = flag.Float64("zofs", -1.5, "Offset image by z (should be negative)") // var repeat = flag.Int("repeat", 60, "Amount of times to repeat render") func main() { log.Printf("Program start") flag.Parse() if *cpuprofile != "" { log.Printf("CPU profiling requested, write to %s", *cpuprofile) f, err := os.Create(*cpuprofile) must(err) defer f.Close() err = pprof.StartCPUProfile(f) must(err) defer pprof.StopCPUProfile() } fb := NewRaylibBuffer(Width, Height) rb := hrend.NewRenderbuffer(fb, Width, Height) o, texture := loadDefault() light := hrend.Vec3f{0, 0, -1} var projection, worldToCamera, viewport hrend.Mat44f rl.InitWindow(Width, Height, "Simple renderer with raylib") defer rl.CloseWindow() rl.SetTargetFPS(60) var thing hrend.Vec2i log.Print(thing) for !rl.WindowShouldClose() { rl.BeginDrawing() screenmat := worldToCamera.Multiply(&projection) screenmat = screenmat.Multiply(&viewport) var sc [3]hrend.Vertex rb.ResetZBuffer() for _, f := range o.Faces { // Precompute perspective for vertices to save time. Notice Z // is not considered: is this orthographic projection? Yeah probably... var fpt [3]hrend.Vec3f for i := range 3 { // Triangles, bro sc[i] = f[i] sc[i].Pos = screenmat.MultiplyPoint3(f[i].Pos) fpt[i] = worldToCamera.MultiplyPoint3(f[i].Pos) } l1 := fpt[2].Sub(fpt[0]) n := l1.CrossProduct(fpt[1].Sub(fpt[0])) n = n.Normalize() intensity := n.MultSimp(&light) if intensity > 0 { hrend.TriangleTextured(&rb, texture, intensity, sc[0], sc[1], sc[2]) } } rl.ClearBackground(rl.RayWhite) rl.DrawText("Congrats! You created your first window!", 190, 200, 20, rl.LightGray) rl.EndDrawing() } }