X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fgrid.cpp;h=3f4d5e2fddb0fa11c9ab99f64f906fc3ecbaeece;hp=aaeada8a73130e2ae2dccd4fb53c3da608731def;hb=8d8b80f3c1511b37f030d897ad97b92993a03ca2;hpb=8e9d872c2ba8dc633d29a673ba93adf38d262a5c diff --git a/source/grid.cpp b/source/grid.cpp index aaeada8a..3f4d5e2f 100644 --- a/source/grid.cpp +++ b/source/grid.cpp @@ -61,28 +61,15 @@ void GridBuilder::init(bool compute_normals) if(compute_normals) { - norm.x = side1.y*side2.z-side1.z*side2.y; - norm.y = side1.z*side2.x-side1.x*side2.z; - norm.z = side1.x*side2.y-side1.y*side2.x; - float l = sqrt(norm.x*norm.x+norm.y*norm.y+norm.z*norm.z); - norm.x /= l; - norm.y /= l; - norm.z /= l; - - binorm.x = norm.y*side1.z-norm.z*side1.y; - binorm.y = norm.z*side1.x-norm.x*side1.z; - binorm.z = norm.x*side1.y-norm.y*side1.x; - l = sqrt(binorm.x*binorm.x+binorm.y*binorm.y+binorm.z*binorm.z); - binorm.x /= l; - binorm.y /= l; - binorm.z /= l; + norm = normalize(cross(side1, side2)); + binorm = normalize(cross(norm, side1)); } } void GridBuilder::build(PrimitiveBuilder &builder) const { - float l1_sq = side1.x*side1.x+side1.y*side1.y+side1.z*side1.z; - float l2 = side2.x*binorm.x+side2.y*binorm.y+side2.z*binorm.z; + float l1_sq = dot(side1, side1); + float l2 = dot(side2, binorm); float u_scale = 1/l1_sq; float v_scale = 1/l2; adjust_texture_scale(u_scale, v_scale, sqrt(l1_sq), l2); @@ -90,22 +77,20 @@ void GridBuilder::build(PrimitiveBuilder &builder) const builder.normal(norm.x, norm.y, norm.z); if(generate_tbn) { - builder.tangent(side1.x, side1.y, side1.z); - builder.binormal(binorm.x, binorm.y, binorm.z); + builder.tangent(side1); + builder.binormal(binorm); } for(unsigned j=0; j<=v_div; ++j) { - float v = j*1.0/v_div; - Vector3 row(origin.x+side2.x*v, origin.y+side2.y*v, origin.z+side2.z*v); - v = (row.x*binorm.x+row.y*binorm.y+row.z*binorm.z)*v_scale; + Vector3 row = side2*(j*1.0f/v_div); + float v = dot(row, binorm)*v_scale; for(unsigned i=0; i<=u_div; ++i) { - float u = i*1.0/u_div; - Vector3 p(row.x+side1.x*u, row.y+side1.y*u, row.z+side1.z*u); - u = (p.x*side1.x+p.y*side1.y+p.z*side1.z)*u_scale; + Vector3 p = row+side1*(i*1.0f/u_div); + float u = dot(p, side1)*u_scale; builder.texcoord(u, v); - builder.vertex(p); + builder.vertex(origin+p); } }