namespace GL {
GridBuilder::GridBuilder(float w, float h, unsigned u, unsigned v):
- origin(-w/2, -h/2, 0),
- side1(w, 0, 0),
- side2(0, h, 0),
- norm(0, 0, 1),
- binorm(0, 1, 0),
- u_div(u),
- v_div(v)
-{
- init(false);
-}
+ GridBuilder(Vector3(-w/2, -h/2, 0), Vector3(w, 0, 0), Vector3(0, h, 0), u, v)
+{ }
GridBuilder::GridBuilder(const Vector3 &o, const Vector3 &s, unsigned u, unsigned v):
- origin(o),
- u_div(u),
- v_div(v)
-{
- if(abs(s.z)<abs(s.x) && abs(s.z)<abs(s.y))
- {
- side1 = Vector3(s.x, 0, 0);
- side2 = Vector3(0, s.y, 0);
- }
- else if(abs(s.y)<abs(s.x))
- {
- side1 = Vector3(0, 0, s.z);
- side2 = Vector3(s.x, 0, 0);
- }
- else
- {
- side1 = Vector3(0, s.y, 0);
- side2 = Vector3(0, 0, s.z);
- }
- init(true);
-}
+ GridBuilder(o, get_side(s, 0), get_side(s, 1), u, v)
+{ }
GridBuilder::GridBuilder(const Vector3 &o, const Vector3 &s1, const Vector3 &s2, unsigned u, unsigned v):
origin(o),
side1(s1),
side2(s2),
- u_div(u),
- v_div(v)
+ u_div(max(u, 1U)),
+ v_div(max(v, 1U))
{
- init(true);
+ norm = normalize(cross(side1, side2));
+ binorm = normalize(cross(norm, side1));
}
-void GridBuilder::init(bool compute_normals)
+Vector3 GridBuilder::get_side(const Vector3 &size, unsigned index)
{
- if(u_div<1)
- u_div = 1;
- if(v_div<1)
- v_div = 1;
-
- if(compute_normals)
- {
- norm = normalize(cross(side1, side2));
- binorm = normalize(cross(norm, side1));
- }
+ if(!size.x)
+ return Vector3(0, (index==0 ? size.y : 0), (index==1 ? size.z : 0));
+ else if(!size.y)
+ return Vector3((index==0 ? size.x : 0), 0, (index==1 ? size.z : 0));
+ else
+ return Vector3((index==0 ? size.x : 0), (index==1 ? size.z : 0), 0);
}
void GridBuilder::build(PrimitiveBuilder &builder) const