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);
builder.normal(norm.x, norm.y, norm.z);
- if(tangent_attr>=0)
- builder.attrib(tangent_attr, side1.x, side1.y, side1.z);
- if(binormal_attr>=0)
- builder.attrib(tangent_attr, binorm.x, binorm.y, binorm.z);
+ if(generate_tbn)
+ {
+ 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);
}
}