diff options
Diffstat (limited to 'src/model')
| -rw-r--r-- | src/model/mapfile.cc | 39 | 
1 files changed, 36 insertions, 3 deletions
diff --git a/src/model/mapfile.cc b/src/model/mapfile.cc index 94a8eab..7775c8d 100644 --- a/src/model/mapfile.cc +++ b/src/model/mapfile.cc @@ -278,6 +278,7 @@ bool MapFile::read_patchdef()  	}  	math::Vector3f patchvertices[rows][columns]; +	math::Vector2f patchtexcoords[rows][columns];  	// read rows  	for (size_t r = 0; r < rows; r++) { @@ -328,6 +329,7 @@ bool MapFile::read_patchdef()  			}  			patchvertices[r][c].assign(x, y, z); +			patchtexcoords[r][c].assign(tx, ty);  		}  		if (!(linestream >> word)) { @@ -394,8 +396,6 @@ bool MapFile::read_patchdef()  	// patchvertices[][] are the control points as read from the .map file  	// mesh[][] is a subdivideXsubdivide quad mesh calculated for each set of 9 control points in the patch -	// TODO texture coordinates, normals -	  	// TODO variable sibdivision  	const size_t subdivide = 4;  	const float binom[3] = {1.0f, 2.0f, 1.0f}; @@ -405,6 +405,7 @@ bool MapFile::read_patchdef()  			math::Vector3f mesh[subdivide + 1][subdivide +1];  			math::Vector3f meshnormals[subdivide + 1][subdivide +1]; +			math::Vector2f meshtexcoords[subdivide + 1][subdivide +1];  			for (size_t i = 0; i <= subdivide; i++) {  				const float u = (float) i / (float) subdivide; @@ -447,10 +448,35 @@ bool MapFile::read_patchdef()  						}  					} +					// assign normal  					meshnormals[i][j].assign(math::crossproduct(tan_u, tan_v));  					meshnormals[i][j].normalize(); +					 +					// calculate texture coordinates +					size_t tr = r; +					size_t tc = c; +					 +					float tu = u; +					float tv = v; +					 +					if (u >= 0.5f) { +						tr++; +						tu -= 0.5f; +					} +					if (v >= 0.5f) { +						tc++; +						tv -= 0.5f; +					} +					tu *= 2.0f; +					tv *= 2.0f; + +					meshtexcoords[i][j] = ( +						(patchtexcoords[tr+1][tc] * tu + patchtexcoords[tr][tc] * (1.0f - tu)) * (1.0f - tv) + +						(patchtexcoords[tr+1][tc+1] * tu + patchtexcoords[tr][tc+1] * (1.0f - tu)) * tv +					); +  					class_box.expand(mesh[i][j] * SCALE); -				}			 +				}  			}  			const math::Vector3f zero; @@ -465,9 +491,16 @@ bool MapFile::read_patchdef()  					);  					quad->n0().assign(meshnormals[i+1][j+1]); +					quad->t0().assign(meshtexcoords[i+1][j+1]); +					  					quad->n1().assign(meshnormals[i][j+1]); +					quad->t1().assign(meshtexcoords[i][j+1]); +					  					quad->n2().assign(meshnormals[i][j]); +					quad->t2().assign(meshtexcoords[i][j]); +					  					quad->n3().assign(meshnormals[i+1][j]); +					quad->t3().assign(meshtexcoords[i+1][j]);  					primitives->add_quad(quad);  				}  | 
