#pragma once #include #include #include #include #include #include #include #include "context.h" namespace cgv { namespace render { template struct element_descriptor_traits { static type_descriptor get_type_descriptor(const T&) { return type_descriptor(cgv::type::info::type_id ::get_id()); } static const void* get_address(const T& value) { return &value; } static void* get_address(T& value) { return &value; } }; template struct element_descriptor_traits < cgv::math::fvec > { static type_descriptor get_type_descriptor(const cgv::math::fvec&) { return type_descriptor(cgv::type::info::type_id::get_id(), N); } static const void* get_address(const cgv::math::fvec& element) { return &element; } static void* get_address(cgv::math::fvec& element) { return &element; } }; template struct element_descriptor_traits < cgv::math::quaternion > { static type_descriptor get_type_descriptor(const cgv::math::quaternion&) { return type_descriptor(cgv::type::info::type_id::get_id(), cgv::type::uint32_type(4)); } static const void* get_address(const cgv::math::quaternion& element) { return &element; } static void* get_address(cgv::math::quaternion& element) { return &element; } }; template struct element_descriptor_traits < cgv::media::color > { static type_descriptor get_type_descriptor(const cgv::media::color&) { return type_descriptor(cgv::type::info::type_id::get_id(), cgv::media::color::nr_components, true); } static const void* get_address(const cgv::media::color& element) { return &element; } static void* get_address(cgv::media::color& element) { return &element; } }; template struct element_descriptor_traits < cgv::math::vec > { static type_descriptor get_type_descriptor(const cgv::math::vec& vec) { return type_descriptor(cgv::type::info::type_id::get_id(), vec.size()); } static const void* get_address(const cgv::math::vec& element) { return &element(0); } static void* get_address(cgv::math::vec& element) { return &element(0); } }; template struct element_descriptor_traits < cgv::math::fmat > { static type_descriptor get_type_descriptor(const cgv::math::fmat&) { return type_descriptor(cgv::type::info::type_id::get_id(), N, M, true); } static const void* get_address(const cgv::math::fmat& element) { return &element(0,0); } static void* get_address(cgv::math::fmat& element) { return &element(0,0); } }; template struct element_descriptor_traits < cgv::math::mat > { static type_descriptor get_type_descriptor(const cgv::math::mat& mat) { return type_descriptor(cgv::type::info::type_id::get_id(), mat.nrows(), mat.ncols(), true); } static const void* get_address(const cgv::math::mat& element) { return &element(0, 0); } static void* get_address(cgv::math::mat& element) { return &element(0, 0); } }; template struct array_descriptor_traits { //TODO: What is this supposed to do; prevents compilation under Linux //enum dummy { d = (sizeof(struct this_type_is_not_an_array_type_or_was_not_detected_as_an_array_type) == sizeof(T)) }; }; template struct array_descriptor_traits < std::vector > { /// return type descriptor for array static type_descriptor get_type_descriptor(const std::vector& vec) { return type_descriptor(element_descriptor_traits::get_type_descriptor(vec[0]), true); } /// return const start address in array static const T* get_address(const std::vector& vec) { return &vec.front(); } /// return start address in array static T* get_address(std::vector& vec) { return &vec.front(); } /// return number elements in array static size_t get_nr_elements(const std::vector& vec) { return vec.size(); } /// return size of array in bytes static size_t get_size(const std::vector& vec) { return vec.size() * sizeof(T); } }; template struct array_descriptor_traits < cgv::math::vec > { /// return type descriptor for array static type_descriptor get_type_descriptor(const cgv::math::vec& vec) { return type_descriptor(element_descriptor_traits::get_type_descriptor(vec(0)), true); } /// return const start address in array static const T* get_address(const cgv::math::vec& vec) { return &vec(0); } /// return start address in array static T* get_address(cgv::math::vec& vec) { return &vec(0); } /// return number elements in array static size_t get_nr_elements(const cgv::math::vec& vec) { return vec.size(); } /// return size of array in bytes static size_t get_size(const cgv::math::vec& vec) { return vec.size() * sizeof(T); } }; } }