Использование DrawUserIndexedPrimitives <> в базовом базовом классе - PullRequest
1 голос
/ 19 октября 2011

Я пишу библиотеку, которая работает вместе с XNA. У меня есть базовый класс для примитивов, из которого я планирую строить самолеты, кубы и другие типы примитивов. В идеале я хотел бы, чтобы мой базовый класс выполнял рендеринг, независимо от используемого типа вершины.

Соответствующий код:

public abstract class Primitive<VT> where VT : IVertexType
{
    private void Draw(GraphicsDevice graphics)
    {
            graphics.DrawUserIndexedPrimitives<VT>(primitiveType_, 
                                                   vertices_, 
                                                   0, 
                                                   vertices_.Length, 
                                                   indices_, 
                                                   0, 
                                                   primitiveCount_);
    }    
} 

Теперь другие классы, кроме производных от этого, используют соответствующий тип вершины:

public abstract class Plane<VT> : Primitive<VT> where VT : IVertextTpye { ... }
public class PlaneColored : Primitive<VertexPositionColor> { .... }
public class PlaneTextured : Primitive<VertexPositionTexture> { .... }

Проблема в том, что я получаю ошибку компиляции при вызове DrawUserIndexPrimitives <>:

Error   1   The type 'VT' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'Microsoft.Xna.Framework.Graphics.GraphicsDevice.DrawUserIndexedPrimitives<T>(Microsoft.Xna.Framework.Graphics.PrimitiveType, T[], int, int, short[], int, int)'  C:\dev\Projects\2010\XNAParts\XNAParts\Parts\Primitive.cs   88

И я не могу изменить конструкцию на struct, иначе универсальный параметр DrawUserIndexPrimitives не будет работать (так как это не структура).

Есть ли способ обойти это?

Заранее спасибо!

1 Ответ

1 голос
/ 19 октября 2011

Как насчет простого изменения Primitive, требующего, чтобы VT была структурой?

public abstract class Primitive<VT> where VT : struct, IVertexType

и аналогично

public abstract class Plane<VT> : Primitive<VT> where VT : struct, IVertexType

Вы утверждаете, что универсальный параметр DrawUserIndexPrimitives не будетработать (так как это не структура) "но неясно, что вы подразумеваете под этим.Какой параметр?Я подозреваю выше, что вы хотите, но это не совсем понятно.

...