Move clipping to triangle drawing
This commit is contained in:
parent
4a399c7bb7
commit
6dce4e3a83
@ -36,7 +36,15 @@ func EdgeIncrementi(v1, v2 Vec2i) (int, int) {
|
|||||||
return (v2.Y - v1.Y), -(v2.X - v1.X)
|
return (v2.Y - v1.Y), -(v2.X - v1.X)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ZClip(v0f Vec3f, v1f Vec3f, v2f Vec3f) bool {
|
||||||
|
maxz := max(v0f.Z, v1f.Z, v2f.Z)
|
||||||
|
return maxz < 0 || maxz > 1
|
||||||
|
}
|
||||||
|
|
||||||
func TriangleFlat(fb *RenderBuffer, color uint, v0f Vec3f, v1f Vec3f, v2f Vec3f) {
|
func TriangleFlat(fb *RenderBuffer, color uint, v0f Vec3f, v1f Vec3f, v2f Vec3f) {
|
||||||
|
if ZClip(v0f, v1f, v2f) {
|
||||||
|
return
|
||||||
|
}
|
||||||
v0 := v0f.ToVec2i()
|
v0 := v0f.ToVec2i()
|
||||||
v1 := v1f.ToVec2i()
|
v1 := v1f.ToVec2i()
|
||||||
v2 := v2f.ToVec2i()
|
v2 := v2f.ToVec2i()
|
||||||
@ -103,6 +111,9 @@ func TriangleFlat(fb *RenderBuffer, color uint, v0f Vec3f, v1f Vec3f, v2f Vec3f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TriangleTextured(fb *RenderBuffer, texture Framebuffer, intensity float32, v0v Vertex, v1v Vertex, v2v Vertex) {
|
func TriangleTextured(fb *RenderBuffer, texture Framebuffer, intensity float32, v0v Vertex, v1v Vertex, v2v Vertex) {
|
||||||
|
if ZClip(v0v.Pos, v1v.Pos, v2v.Pos) {
|
||||||
|
return
|
||||||
|
}
|
||||||
v0 := v0v.Pos.ToVec2i()
|
v0 := v0v.Pos.ToVec2i()
|
||||||
v1 := v1v.Pos.ToVec2i()
|
v1 := v1v.Pos.ToVec2i()
|
||||||
v2 := v2v.Pos.ToVec2i()
|
v2 := v2v.Pos.ToVec2i()
|
||||||
|
@ -5,7 +5,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
|
||||||
"os"
|
"os"
|
||||||
"renderer1/hrend"
|
"renderer1/hrend"
|
||||||
"runtime/pprof" // For performance profiling (unnecessary)
|
"runtime/pprof" // For performance profiling (unnecessary)
|
||||||
@ -91,11 +90,11 @@ func main() {
|
|||||||
rb := hrend.NewRenderbuffer(fb, Width, Height)
|
rb := hrend.NewRenderbuffer(fb, Width, Height)
|
||||||
o, texture := loadDefault()
|
o, texture := loadDefault()
|
||||||
|
|
||||||
light := hrend.Vec3f{
|
// light := hrend.Vec3f{
|
||||||
X: 0,
|
// X: 0,
|
||||||
Y: 0,
|
// Y: 0,
|
||||||
Z: -1,
|
// Z: -1,
|
||||||
}
|
// }
|
||||||
|
|
||||||
var thing hrend.Vec2i
|
var thing hrend.Vec2i
|
||||||
log.Print(thing)
|
log.Print(thing)
|
||||||
@ -158,24 +157,18 @@ func main() {
|
|||||||
for _, f := range o.Faces {
|
for _, f := range o.Faces {
|
||||||
// Precompute perspective for vertices to save time. Notice Z
|
// Precompute perspective for vertices to save time. Notice Z
|
||||||
// is not considered: is this orthographic projection? Yeah probably...
|
// is not considered: is this orthographic projection? Yeah probably...
|
||||||
var fpt [3]hrend.Vec3f
|
//var fpt [3]hrend.Vec3f
|
||||||
maxz := float32(-math.MaxFloat32)
|
|
||||||
for i := range 3 { // Triangles, bro
|
for i := range 3 { // Triangles, bro
|
||||||
sc[i] = f[i]
|
sc[i] = f[i]
|
||||||
sc[i].Pos = screenmat.MultiplyPoint3(f[i].Pos)
|
sc[i].Pos = screenmat.MultiplyPoint3(f[i].Pos)
|
||||||
fpt[i] = worldToCamera.MultiplyPoint3(f[i].Pos)
|
//fpt[i] = worldToCamera.MultiplyPoint3(f[i].Pos)
|
||||||
maxz = max(maxz, sc[i].Pos.Z)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if maxz < 0 || maxz > 1 {
|
//l1 := fpt[2].Sub(fpt[0])
|
||||||
//log.Printf("Clipping %f %f %f", sc[0].Pos.Z, sc[1].Pos.Z, sc[2].Pos.Z)
|
//n := l1.CrossProduct(fpt[1].Sub(fpt[0]))
|
||||||
continue
|
//n = n.Normalize()
|
||||||
}
|
//intensity := n.MultSimp(&light)
|
||||||
|
intensity := float32(1.0)
|
||||||
l1 := fpt[2].Sub(fpt[0])
|
|
||||||
n := l1.CrossProduct(fpt[1].Sub(fpt[0]))
|
|
||||||
n = n.Normalize()
|
|
||||||
intensity := n.MultSimp(&light)
|
|
||||||
if intensity > 0 {
|
if intensity > 0 {
|
||||||
hrend.TriangleTextured(&rb, texture, intensity, sc[0], sc[1], sc[2])
|
hrend.TriangleTextured(&rb, texture, intensity, sc[0], sc[1], sc[2])
|
||||||
//hrend.TriangleFlat(&rb, hrend.Col2Uint(byte(255*intensity), byte(255*intensity), byte(255*intensity)), sc[0].Pos, sc[1].Pos, sc[2].Pos)
|
//hrend.TriangleFlat(&rb, hrend.Col2Uint(byte(255*intensity), byte(255*intensity), byte(255*intensity)), sc[0].Pos, sc[1].Pos, sc[2].Pos)
|
||||||
|
Loading…
Reference in New Issue
Block a user