2
0
Joshua Moerman 11 жил өмнө
parent
commit
77c704e210

+ 82 - 0
glm/gtx/range.hpp

@@ -0,0 +1,82 @@
+///////////////////////////////////////////////////////////////////////////////////
+/// OpenGL Mathematics (glm.g-truc.net)
+///
+/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
+/// Permission is hereby granted, free of charge, to any person obtaining a copy
+/// of this software and associated documentation files (the "Software"), to deal
+/// in the Software without restriction, including without limitation the rights
+/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+/// copies of the Software, and to permit persons to whom the Software is
+/// furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+/// THE SOFTWARE.
+///
+/// @ref gtx_range
+/// @file glm/gtx/range.hpp
+/// @date 2014-09-19 / 2014-09-19
+/// @author Joshua Moerman
+///
+/// @brief Defines begin and end for vectors and matrices. Useful for range-based for loop.
+/// The range is defined over the elements, not over columns or rows (e.g. mat4 has 16 elements).
+///
+///////////////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+#include "../gtc/type_ptr.hpp"
+
+namespace glm{
+namespace detail
+{
+	/* The glm types provide a .length() member, but for matrices
+	 this only defines the number of columns, so we need to work around this */
+	template <typename T, precision P>
+	length_t number_of_elements_(tvec2<T, P> const & v){
+		return v.length();
+	}
+
+	template <typename T, precision P>
+	length_t number_of_elements_(tvec3<T, P> const & v){
+		return v.length();
+	}
+
+	template <typename T, precision P>
+	length_t number_of_elements_(tvec4<T, P> const & v){
+		return v.length();
+	}
+
+	template <typename genType>
+	length_t number_of_elements_(genType const & v){
+		return v.length() * v[0].length();
+	}
+
+	template <typename genType>
+	const typename genType::value_type * begin(const genType& v){
+		return value_ptr(v);
+	}
+
+	template <typename genType>
+	const typename genType::value_type * end(const genType& v){
+		return begin(v) + number_of_elements_(v);
+	}
+
+	template <typename genType>
+	typename genType::value_type * begin(genType& v){
+		return value_ptr(v);
+	}
+
+	template <typename genType>
+	typename genType::value_type * end(genType& v){
+		return begin(v) + number_of_elements_(v);
+	}
+}
+}

+ 1 - 0
test/gtx/CMakeLists.txt

@@ -38,6 +38,7 @@ glmCreateTestGTC(gtx_polar_coordinates)
 glmCreateTestGTC(gtx_projection)
 glmCreateTestGTC(gtx_quaternion)
 glmCreateTestGTC(gtx_dual_quaternion)
+glmCreateTestGTC(gtx_range)
 glmCreateTestGTC(gtx_rotate_normalized_axis)
 glmCreateTestGTC(gtx_rotate_vector)
 glmCreateTestGTC(gtx_scalar_relational)

+ 46 - 0
test/gtx/gtx_range.cpp

@@ -0,0 +1,46 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Created : 2014-09-19
+// Updated : 2014-09-19
+// Licence : This source is under MIT licence
+// File    : test/gtx/gtx_range.cpp
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+#include <glm/glm.hpp>
+#include <glm/gtc/epsilon.hpp>
+#include <glm/gtx/range.hpp>
+
+int testVec(){
+	int Error(0);
+	glm::vec3 v(1, 2, 3);
+
+	int count = 0;
+	for(float x : v){ count++; }
+	Error += count == 3 ? 0 : 1;
+
+	for(float& x : v){ x = 0; }
+	Error += glm::all(glm::equal(v, glm::vec3(0, 0, 0))) ? 0 : 1;
+	return Error;
+}
+
+int testMat(){
+	int Error(0);
+	glm::mat4x3 m(1);
+
+	int count = 0;
+	for(float x : m){ count++; }
+	Error += count == 12 ? 0 : 1;
+
+	for(float& x : m){ x = 0; }
+	glm::vec4 v(1, 1, 1, 1);
+	Error += glm::all(glm::equal(m*v, glm::vec3(0, 0, 0))) ? 0 : 1;
+	return Error;
+}
+
+int main(){
+	int Error(0);
+	Error += testVec();
+	Error += testMat();
+	return Error;
+}