void draw() { DMatrix4 view, projection; parg_zcam_dmatrices(&projection, &view); DMatrix4 model = DM4MakeTranslation((DVector3){-0.5, -0.5, -1}); Matrix4 mvp = M4MakeFromDM4(DM4Mul(projection, DM4Mul(view, model))); const Vector4 BLACK = {0, 0, 0, 1}; Vector2 mapsize = {1, 1}; parg_aar rect = parg_zcam_get_rectangle(); parg_tilerange tiles; float slippyfract = parg_aar_to_tilerange(rect, mapsize, &tiles); parg_aar slippyaar = parg_aar_from_tilename(tiles.mintile, mapsize); Vector4* slippybox = (Vector4*) &slippyaar; slippybox->z = 1.0 / (slippybox->z - slippybox->x); slippybox->w = 1.0 / (slippybox->w - slippybox->y); parg_draw_clear(); parg_shader_bind(P_OCEAN); parg_uniform_matrix4f(U_MVP, &mvp); parg_uniform1i(U_SHOWGRID, showgrid); parg_uniform4f(U_SLIPPYBOX, slippybox); parg_uniform1f(U_SLIPPYFRACT, slippyfract); parg_texture_bind(ocean_texture, 0); parg_varray_bind(parg_mesh_index(ocean_mesh)); parg_varray_enable( parg_mesh_coord(ocean_mesh), A_POSITION, 3, PARG_FLOAT, 0, 0); parg_draw_triangles_u16(0, parg_mesh_ntriangles(ocean_mesh)); parg_shader_bind(P_SOLID); parg_uniform_matrix4f(U_MVP, &mvp); parg_uniform4f(U_COLOR, &BLACK); parg_varray_bind(parg_mesh_index(landmass_mesh)); parg_varray_enable( parg_mesh_coord(landmass_mesh), A_POSITION, 3, PARG_FLOAT, 0, 0); parg_draw_wireframe_triangles_u16(0, parg_mesh_ntriangles(landmass_mesh)); if (mode_highp) { float x = parg_aar_width(rect) / fbsize.x; float y = parg_aar_height(rect) / fbsize.y; slippybox->z *= x; slippybox->w *= y; slippybox->x = (slippybox->x - rect.left) / x; slippybox->y = (slippybox->y - rect.bottom) / y; } parg_shader_bind(mode_highp ? P_LANDMASS_FRAGCOORD : P_LANDMASS); parg_uniform_matrix4f(U_MVP, &mvp); parg_uniform1i(U_SHOWGRID, showgrid); parg_uniform4f(U_SLIPPYBOX, slippybox); parg_uniform1f(U_SLIPPYFRACT, slippyfract); parg_texture_bind(paper_texture, 0); parg_draw_triangles_u16(0, parg_mesh_ntriangles(landmass_mesh)); }
void parg_zcam_highprec(Matrix4* vp, Point3* eyepos_lo, Point3* eyepos_hi) { DPoint3 origin = {0, 0, 0}; DPoint3 target = {0, 0, -1}; DVector3 up = {0, 1, 0}; DMatrix4 view = DM4MakeLookAt(origin, target, up); if (vp) { *vp = M4MakeFromDM4(DM4Mul(_projmat, view)); } Point3 eyepos = P3MakeFromDP3(_camerapos); DPoint3 deyepos = DP3MakeFromP3(eyepos); DVector3 difference = DP3Sub(_camerapos, deyepos); if (eyepos_lo) { *eyepos_lo = P3MakeFromV3(V3MakeFromDV3(difference)); } *eyepos_hi = eyepos; }