]> git.tdb.fi Git - libs/gl.git/blobdiff - source/grid.cpp
Add more public methods to Transform
[libs/gl.git] / source / grid.cpp
index aaeada8a73130e2ae2dccd4fb53c3da608731def..3f4d5e2fddb0fa11c9ab99f64f906fc3ecbaeece 100644 (file)
@@ -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);
                }
        }