diff --git a/allg5/primitives.go b/allg5/primitives.go index 114e3f5..d059acb 100644 --- a/allg5/primitives.go +++ b/allg5/primitives.go @@ -2,8 +2,35 @@ package allg5 // #include // #include +/* +void SetTransform(ALLEGRO_TRANSFORM* t, float ix, float iy, float iz, float jx, float jy, float jz, float kx, float ky, float kz) +{ + t->m[0][0] = ix; + t->m[0][1] = iy; + t->m[0][2] = iz; + t->m[1][0] = jx; + t->m[1][1] = jy; + t->m[1][2] = jz; + t->m[2][0] = kx; + t->m[2][1] = ky; + t->m[2][2] = kz; +} + +bool SetTextureMatrix(ALLEGRO_TRANSFORM* t) +{ + bool result = true; + result &= al_set_shader_bool(ALLEGRO_SHADER_VAR_USE_TEX_MATRIX, 1); + result &= al_set_shader_matrix(ALLEGRO_SHADER_VAR_TEX_MATRIX, t); + return result; +} +*/ import "C" -import "unsafe" +import ( + "unsafe" + + "opslag.de/schobers/geom" + "opslag.de/schobers/geom/lin" +) func DrawFilledRectangle(x1, y1, x2, y2 float32, c Color) { C.al_draw_filled_rectangle(C.float(x1), C.float(y1), C.float(x2), C.float(y2), c.color) @@ -25,6 +52,125 @@ func DrawRectangle(x1, y1, x2, y2 float32, c Color, thickness float32) { C.al_draw_rectangle(C.float(x1), C.float(y1), C.float(x2), C.float(y2), c.color, C.float(thickness)) } +func DrawTexture(x1, y1, x2, y2, x3, y3, x4, y4 float32, b *Bitmap) { + var vtxs [4]C.ALLEGRO_VERTEX + var white = NewColor(255, 255, 255) + vtxs[0].x = C.float(x1) + vtxs[0].y = C.float(y1) + vtxs[0].u = 0 + vtxs[0].v = 0 + vtxs[0].color = white.color + vtxs[1].x = C.float(x2) + vtxs[1].y = C.float(y2) + vtxs[1].u = C.float(b.width) + vtxs[1].v = 0 + vtxs[1].color = white.color + vtxs[2].x = C.float(x4) + vtxs[2].y = C.float(y4) + vtxs[2].u = 0 + vtxs[2].v = C.float(b.height) + vtxs[2].color = white.color + vtxs[3].x = C.float(x3) + vtxs[3].y = C.float(y3) + vtxs[3].u = C.float(b.width) + vtxs[3].v = C.float(b.height) + vtxs[3].color = white.color + + C.al_draw_prim(unsafe.Pointer(&vtxs), nil, b.bitmap, 0, 4, C.ALLEGRO_PRIM_TRIANGLE_STRIP) +} + +func DrawTextureProj(x1, y1, x2, y2, x3, y3, x4, y4 float32, b *Bitmap) { + var w, h = float32(b.width), float32(b.height) + var proj = lin.Projection32( + geom.PtF32(0, 0), geom.PtF32(x1, y1), + geom.PtF32(w, 0), geom.PtF32(x2, y2), + geom.PtF32(w, h), geom.PtF32(x3, y3), + geom.PtF32(0, h), geom.PtF32(x4, y4)) + + var w05, h05 = .5 * w, .5 * h + var pt0 = lin.Project32(proj, geom.PtF32(w05, h05)) + var pt2 = lin.Project32(proj, geom.PtF32(w05, 0)) + var pt4 = lin.Project32(proj, geom.PtF32(w, h05)) + var pt6 = lin.Project32(proj, geom.PtF32(w05, h)) + var pt8 = lin.Project32(proj, geom.PtF32(0, h05)) + + var cw, ch, cw05, ch05 = C.float(w), C.float(h), C.float(w05), C.float(h05) + var vtxs [10]C.ALLEGRO_VERTEX + var white = NewColor(255, 255, 255) + vtxs[0].x = C.float(pt0.X) + vtxs[0].y = C.float(pt0.Y) + vtxs[0].u = cw05 + vtxs[0].v = ch05 + vtxs[0].color = white.color + vtxs[1].x = C.float(x1) + vtxs[1].y = C.float(y1) + vtxs[1].u = 0 + vtxs[1].v = 0 + vtxs[1].color = white.color + vtxs[2].x = C.float(pt2.X) + vtxs[2].y = C.float(pt2.Y) + vtxs[2].u = cw05 + vtxs[2].v = 0 + vtxs[2].color = white.color + vtxs[3].x = C.float(x2) + vtxs[3].y = C.float(y2) + vtxs[3].u = cw + vtxs[3].v = 0 + vtxs[3].color = white.color + vtxs[4].x = C.float(pt4.X) + vtxs[4].y = C.float(pt4.Y) + vtxs[4].u = cw + vtxs[4].v = ch05 + vtxs[4].color = white.color + vtxs[5].x = C.float(x3) + vtxs[5].y = C.float(y3) + vtxs[5].u = cw + vtxs[5].v = ch + vtxs[5].color = white.color + vtxs[6].x = C.float(pt6.X) + vtxs[6].y = C.float(pt6.Y) + vtxs[6].u = cw05 + vtxs[6].v = ch + vtxs[6].color = white.color + vtxs[7].x = C.float(x4) + vtxs[7].y = C.float(y4) + vtxs[7].u = 0 + vtxs[7].v = ch + vtxs[7].color = white.color + vtxs[8].x = C.float(pt8.X) + vtxs[8].y = C.float(pt8.Y) + vtxs[8].u = 0 + vtxs[8].v = ch05 + vtxs[8].color = white.color + vtxs[9].x = C.float(x1) + vtxs[9].y = C.float(y1) + vtxs[9].u = 0 + vtxs[9].v = 0 + vtxs[9].color = white.color + + C.al_draw_prim(unsafe.Pointer(&vtxs), nil, b.bitmap, 0, 10, C.ALLEGRO_PRIM_TRIANGLE_FAN) + + // var lineC = NewColor(0, 255, 0) + // drawLine := func(p1, p2 geom.PointF32) { + // DrawLine(p1.X, p1.Y, p2.X, p2.Y, lineC, 2) + // } + // bounds := []geom.PointF32{geom.PtF32(x1, y1), pt2, geom.PtF32(x2, y2), pt4, geom.PtF32(x3, y3), pt6, geom.PtF32(x4, y4), pt8} + // for i, pt := range bounds { + // drawLine(pt, bounds[(i+1)%8]) + // drawLine(pt0, pt) + // } + + // var pointC = NewColor(255, 0, 0) + // drawPt := func(p geom.PointF32) { + // DrawFilledRectangle(p.X-2, p.Y-2, p.X+2, p.Y+2, pointC) + // } + // drawPt(pt0) + // drawPt(pt2) + // drawPt(pt4) + // drawPt(pt6) + // drawPt(pt8) +} + func DrawTriangle(x1, y1, x2, y2, x3, y3 float32, c Color, thickness float32) { C.al_draw_triangle(C.float(x1), C.float(y1), C.float(x2), C.float(y2), C.float(x3), C.float(y3), c.color, C.float(thickness)) }