|
@@ -1938,36 +1938,53 @@ void gs_vertexbuffer_destroy(gs_vertbuffer_t *vertbuffer)
|
|
|
delete vertbuffer;
|
|
|
}
|
|
|
|
|
|
-void gs_vertexbuffer_flush(gs_vertbuffer_t *vertbuffer)
|
|
|
+static inline void gs_vertexbuffer_flush_internal(gs_vertbuffer_t *vertbuffer,
|
|
|
+ const gs_vb_data *data)
|
|
|
{
|
|
|
+ size_t num_tex = data->num_tex < vertbuffer->uvBuffers.size()
|
|
|
+ ? data->num_tex
|
|
|
+ : vertbuffer->uvBuffers.size();
|
|
|
+
|
|
|
if (!vertbuffer->dynamic) {
|
|
|
blog(LOG_ERROR, "gs_vertexbuffer_flush: vertex buffer is "
|
|
|
"not dynamic");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- vertbuffer->FlushBuffer(vertbuffer->vertexBuffer,
|
|
|
- vertbuffer->vbd.data->points, sizeof(vec3));
|
|
|
+ if (data->points)
|
|
|
+ vertbuffer->FlushBuffer(vertbuffer->vertexBuffer,
|
|
|
+ data->points, sizeof(vec3));
|
|
|
|
|
|
- if (vertbuffer->normalBuffer)
|
|
|
+ if (vertbuffer->normalBuffer && data->normals)
|
|
|
vertbuffer->FlushBuffer(vertbuffer->normalBuffer,
|
|
|
- vertbuffer->vbd.data->normals, sizeof(vec3));
|
|
|
+ data->normals, sizeof(vec3));
|
|
|
|
|
|
- if (vertbuffer->tangentBuffer)
|
|
|
+ if (vertbuffer->tangentBuffer && data->tangents)
|
|
|
vertbuffer->FlushBuffer(vertbuffer->tangentBuffer,
|
|
|
- vertbuffer->vbd.data->tangents, sizeof(vec3));
|
|
|
+ data->tangents, sizeof(vec3));
|
|
|
|
|
|
- if (vertbuffer->colorBuffer)
|
|
|
+ if (vertbuffer->colorBuffer && data->colors)
|
|
|
vertbuffer->FlushBuffer(vertbuffer->colorBuffer,
|
|
|
- vertbuffer->vbd.data->colors, sizeof(uint32_t));
|
|
|
+ data->colors, sizeof(uint32_t));
|
|
|
|
|
|
- for (size_t i = 0; i < vertbuffer->uvBuffers.size(); i++) {
|
|
|
- gs_tvertarray &tv = vertbuffer->vbd.data->tvarray[i];
|
|
|
+ for (size_t i = 0; i < num_tex; i++) {
|
|
|
+ gs_tvertarray &tv = data->tvarray[i];
|
|
|
vertbuffer->FlushBuffer(vertbuffer->uvBuffers[i],
|
|
|
tv.array, tv.width*sizeof(float));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void gs_vertexbuffer_flush(gs_vertbuffer_t *vertbuffer)
|
|
|
+{
|
|
|
+ gs_vertexbuffer_flush_internal(vertbuffer, vertbuffer->vbd.data);
|
|
|
+}
|
|
|
+
|
|
|
+void gs_vertexbuffer_flush_direct(gs_vertbuffer_t *vertbuffer,
|
|
|
+ const gs_vb_data *data)
|
|
|
+{
|
|
|
+ gs_vertexbuffer_flush_internal(vertbuffer, data);
|
|
|
+}
|
|
|
+
|
|
|
struct gs_vb_data *gs_vertexbuffer_get_data(const gs_vertbuffer_t *vertbuffer)
|
|
|
{
|
|
|
return vertbuffer->vbd.data;
|
|
@@ -1979,7 +1996,8 @@ void gs_indexbuffer_destroy(gs_indexbuffer_t *indexbuffer)
|
|
|
delete indexbuffer;
|
|
|
}
|
|
|
|
|
|
-void gs_indexbuffer_flush(gs_indexbuffer_t *indexbuffer)
|
|
|
+static inline void gs_indexbuffer_flush_internal(gs_indexbuffer_t *indexbuffer,
|
|
|
+ const void *data)
|
|
|
{
|
|
|
HRESULT hr;
|
|
|
|
|
@@ -1992,12 +2010,22 @@ void gs_indexbuffer_flush(gs_indexbuffer_t *indexbuffer)
|
|
|
if (FAILED(hr))
|
|
|
return;
|
|
|
|
|
|
- memcpy(map.pData, indexbuffer->indices.data,
|
|
|
- indexbuffer->num * indexbuffer->indexSize);
|
|
|
+ memcpy(map.pData, data, indexbuffer->num * indexbuffer->indexSize);
|
|
|
|
|
|
indexbuffer->device->context->Unmap(indexbuffer->indexBuffer, 0);
|
|
|
}
|
|
|
|
|
|
+void gs_indexbuffer_flush(gs_indexbuffer_t *indexbuffer)
|
|
|
+{
|
|
|
+ gs_indexbuffer_flush_internal(indexbuffer, indexbuffer->indices.data);
|
|
|
+}
|
|
|
+
|
|
|
+void gs_indexbuffer_flush_direct(gs_indexbuffer_t *indexbuffer,
|
|
|
+ const void *data)
|
|
|
+{
|
|
|
+ gs_indexbuffer_flush_internal(indexbuffer, data);
|
|
|
+}
|
|
|
+
|
|
|
void *gs_indexbuffer_get_data(const gs_indexbuffer_t *indexbuffer)
|
|
|
{
|
|
|
return indexbuffer->indices.data;
|