Я пытаюсь реализовать структуру VertexBufferLayout
, следуя TheChernoProject Series на openGL .Я достаточно легко адаптировал серию C ++ к Rust, но я застрял.
VertexBufferElement
имеет счетчик, glEnum для data_type
, который он использует, и логический, нормализованный.Существует универсальный метод с именем push
, который принимает значение u32, которое помещает VertexBufferElement в элементы Vec и обновляет шаг.
Мне не удается заставить функцию принимать код для сопоставления типа.Я попытался использовать TypeId
, Any
и PhantomData
, когда получил ошибку.
pub fn push<T: 'a>(&mut self, count: u32) {
let dt = TypeId::of::<T>();
let (data_type, normalized) = if dt == TypeId::of::<i8>() {
(gl::BYTE, false)
} else if dt == TypeId::of::<u8>() {
(gl::UNSIGNED_BYTE, true)
} else if dt == TypeId::of::<i16>() {
(gl::SHORT, false)
} else if dt == TypeId::of::<u16>() {
(gl::UNSIGNED_SHORT, false)
} else if dt == TypeId::of::<i32>() {
(gl::INT, false)
} else if dt == TypeId::of::<u32>() {
(gl::UNSIGNED_INT, false)
} else if dt == TypeId::of::<f16>() {
(gl::HALF_FLOAT, false)
} else if dt == TypeId::of::<f32>() {
(gl::FLOAT, false)
} else if dt == TypeId::of::<f64>() {
(gl::DOUBLE, false)
} else {
panic!("Incompatible Type")
};
self.elements.push(VertexBufferElement{data_type, count, normalized, _marker: PhantomData});
self.stride += mem::size_of::<T>();
}
vertex_buffer_layout.rs
error[E0310]: the parameter type `T` may not live long enough
--> opengl\examples\vertex_buffer_layout.rs:26:18
|
25 | pub fn push<T: 'a>(&mut self, count: u32) {
| -- help: consider adding an explicit lifetime bound `T: 'static`...
26 | let dt = TypeId::of::<T>();
| ^^^^^^^^^^^^^^^
|
note: ...so that the type `T` will meet its required lifetime bounds
--> opengl\examples\vertex_buffer_layout.rs:26:18
|
26 | let dt = TypeId::of::<T>();
|
Сначала это был 'T', возможно, не жил достаточно долго, но это была только общая функция, и float диктовал только сохраненное число, а не сам тип, поэтому я попытался PhantomData
.После любых ошибок я не имел ни малейшего представления о том, что делаю, никогда раньше не использовал PhantomData
и не могу ничего найти для этой ситуации.