blob: adac4c42ee48c1cf02a66ab8193d3d2e9d30f595 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
/****************************************************************************
**
** Copyright (C) 2008-2012 NVIDIA Corporation.
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt 3D Studio.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#pragma once
#ifndef QT3DS_RENDER_INPUT_ASSEMBLER_H
#define QT3DS_RENDER_INPUT_ASSEMBLER_H
#include "foundation/Qt3DSRefCounted.h"
#include "foundation/Qt3DSFoundation.h"
#include "foundation/Qt3DSAtomic.h"
#include "foundation/Utils.h"
#include "render/Qt3DSRenderBaseTypes.h"
#include "render/backends/Qt3DSRenderBackend.h"
namespace qt3ds {
namespace render {
// forward declarations
class NVRenderContextImpl;
class NVRenderBackend;
class NVRenderAttribLayout;
///< this class handles the vertex attribute layout setup
class NVRenderInputAssembler : public NVRefCounted
{
public:
/**
* @brief constructor
*
* NOTE: The limit for buffers count is currently 16
*
* @param[in] context Pointer to context
* @param[in] attribLayout Pointer to NVRenderAttribLayout object
* @param[in] buffers list of vertex buffers
* @param[in] indexBuffer pointer to index buffer. Can be NULL
* @param[in] strides list of strides of the buffer
* @param[in] offsets list of offsets into the buffer
* @param[in] primType primitive type used for drawing
* @param[in] patchVertexCount if primitive is "Patch" this is the vertex count for a
*single patch
*
* @return No return.
*/
NVRenderInputAssembler(NVRenderContextImpl &context, NVRenderAttribLayout *attribLayout,
NVConstDataRef<NVRenderVertexBuffer *> buffers,
const NVRenderIndexBuffer *indexBuffer,
NVConstDataRef<QT3DSU32> strides, NVConstDataRef<QT3DSU32> offsets,
NVRenderDrawMode::Enum primType = NVRenderDrawMode::Triangles,
QT3DSU32 patchVertexCount = 1);
///< destructor
~NVRenderInputAssembler();
// define refcount functions
QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
/**
* @brief get the backend object handle
*
* @return the backend object handle.
*/
NVRenderBackend::NVRenderBackendInputAssemblerObject GetInputAssemblerHandle() const
{
return m_InputAssemblertHandle;
}
/**
* @brief get the attached index buffer
*
* @return the index buffer
*/
const NVRenderIndexBuffer *GetIndexBuffer() { return m_IndexBuffer; }
/**
* @brief get the index count of the attached index buffer (if any)
*
* @return the index buffer count
*/
QT3DSU32 GetIndexCount() const;
/**
* @brief get the vertex count of the buffer
* Note this makes only sense if we have a single
* interleaved buffer
*
* @return the vertex buffer count
*/
QT3DSU32 GetVertexCount() const;
/**
* @brief get the primitive type used for drawing
*
* @return primitive type
*/
NVRenderDrawMode::Enum GetPrimitiveType() const { return m_PrimitiveType; }
/**
* @brief set the per vertex patch count
*
* @return none
*/
void SetPatchVertexCount(QT3DSU32 count)
{
if (count != m_PatchVertexCount) {
// clamp to 1;
m_PatchVertexCount = (count == 0) ? 1 : count;
;
m_Backend->SetPatchVertexCount(m_InputAssemblertHandle, m_PatchVertexCount);
}
}
private:
NVRenderContextImpl &m_Context; ///< pointer to context
NVFoundationBase &m_Foundation; ///< pointer to foundation
volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
NVRenderBackend *m_Backend; ///< pointer to backend
NVRenderAttribLayout *m_AttribLayout; ///< pointer to attribute layout
nvvector<NVRenderVertexBuffer *> m_VertexBuffers; ///< vertex buffers
const NVRenderIndexBuffer *m_IndexBuffer; ///< index buffer
NVConstDataRef<NVRenderBackend::NVRenderBackendBufferObject>
m_VertexbufferHandles; ///< opaque vertex buffer backend handles
NVRenderBackend::NVRenderBackendInputAssemblerObject
m_InputAssemblertHandle; ///< opaque backend handle
NVRenderDrawMode::Enum m_PrimitiveType; ///< primitive type used for drawing
QT3DSU32 m_PatchVertexCount; ///< vertex count if primitive type is patch
};
}
}
#endif
|