3 This file is part of libmspgl
4 Copyright © 2011 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
10 #include "primitivebuilder.h"
17 GridBuilder::GridBuilder(float w, float h, unsigned u, unsigned v):
18 origin(-w/2, -h/2, 0),
29 GridBuilder::GridBuilder(const Vector3 &o, const Vector3 &s, unsigned u, unsigned v):
34 if(abs(s.z)<abs(s.x) && abs(s.z)<abs(s.y))
36 side1 = Vector3(s.x, 0, 0);
37 side2 = Vector3(0, s.y, 0);
39 else if(abs(s.y)<abs(s.x))
41 side1 = Vector3(0, 0, s.z);
42 side2 = Vector3(s.x, 0, 0);
46 side1 = Vector3(0, s.y, 0);
47 side2 = Vector3(0, 0, s.z);
52 GridBuilder::GridBuilder(const Vector3 &o, const Vector3 &s1, const Vector3 &s2, unsigned u, unsigned v):
62 void GridBuilder::init(bool compute_normals)
71 norm.x = side1.y*side2.z-side1.z*side2.y;
72 norm.y = side1.z*side2.x-side1.x*side2.z;
73 norm.z = side1.x*side2.y-side1.y*side2.x;
74 float l = sqrt(norm.x*norm.x+norm.y*norm.y+norm.z*norm.z);
79 binorm.x = norm.y*side1.z-norm.z*side1.y;
80 binorm.y = norm.z*side1.x-norm.x*side1.z;
81 binorm.z = norm.x*side1.y-norm.y*side1.x;
82 l = sqrt(binorm.x*binorm.x+binorm.y*binorm.y+binorm.z*binorm.z);
89 void GridBuilder::build(PrimitiveBuilder &builder) const
91 float l1_sq = side1.x*side1.x+side1.y*side1.y+side1.z*side1.z;
92 float l2 = side2.x*binorm.x+side2.y*binorm.y+side2.z*binorm.z;
93 float u_scale = 1/l1_sq;
95 adjust_texture_scale(u_scale, v_scale, sqrt(l1_sq), l2);
97 builder.normal(norm.x, norm.y, norm.z);
99 builder.attrib(tangent_attr, side1.x, side1.y, side1.z);
101 builder.attrib(tangent_attr, binorm.x, binorm.y, binorm.z);
103 for(unsigned j=0; j<=v_div; ++j)
105 float v = j*1.0/v_div;
106 Vector3 row(origin.x+side2.x*v, origin.y+side2.y*v, origin.z+side2.z*v);
107 v = (row.x*binorm.x+row.y*binorm.y+row.z*binorm.z)*v_scale;
108 for(unsigned i=0; i<=u_div; ++i)
110 float u = i*1.0/u_div;
111 Vector3 p(row.x+side1.x*u, row.y+side1.y*u, row.z+side1.z*u);
112 u = (p.x*side1.x+p.y*side1.y+p.z*side1.z)*u_scale;
113 builder.texcoord(u, v);
118 for(unsigned j=0; j<v_div; ++j)
120 builder.begin(TRIANGLE_STRIP);
121 for(unsigned i=0; i<=u_div; ++i)
123 builder.element((j+1)*(u_div+1)+i);
124 builder.element(j*(u_div+1)+i);