Files
LNXRNT/Kinc/Backends/Graphics4/Direct3D9/Sources/kinc/backend/graphics4/vertexbuffer.cpp
2025-01-29 10:55:49 +01:00

76 lines
2.7 KiB
C++

#include <kinc/graphics4/graphics.h>
#include <kinc/graphics4/vertexbuffer.h>
#include <kinc/backend/SystemMicrosoft.h>
#include "Direct3D9.h"
struct kinc_g4_vertex_buffer *kinc_internal_current_vertex_buffer = NULL;
void kinc_g4_vertex_buffer_init(kinc_g4_vertex_buffer_t *buffer, int count, kinc_g4_vertex_structure_t *structure, kinc_g4_usage_t usage,
int instance_data_step_rate) {
buffer->impl.myCount = count;
buffer->impl.instanceDataStepRate = instance_data_step_rate;
DWORD usageFlags = D3DUSAGE_WRITEONLY;
if (usage == KINC_G4_USAGE_DYNAMIC) {
usageFlags = D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY;
}
buffer->impl.myStride = 0;
for (int i = 0; i < structure->size; ++i) {
buffer->impl.myStride += kinc_g4_vertex_data_size(structure->elements[i].data);
}
kinc_microsoft_affirm(device->CreateVertexBuffer(kinc_g4_vertex_buffer_stride(buffer) * count, usageFlags, 0, D3DPOOL_DEFAULT, &buffer->impl.vb, 0));
}
void kinc_g4_vertex_buffer_destroy(kinc_g4_vertex_buffer_t *buffer) {
buffer->impl.vb->Release();
}
float *kinc_g4_vertex_buffer_lock_all(kinc_g4_vertex_buffer_t *buffer) {
return kinc_g4_vertex_buffer_lock(buffer, 0, kinc_g4_vertex_buffer_count(buffer));
}
float *kinc_g4_vertex_buffer_lock(kinc_g4_vertex_buffer_t *buffer, int start, int count) {
float *vertices;
kinc_internal_vertex_buffer_unset(buffer);
kinc_microsoft_affirm(buffer->impl.vb->Lock(start, count * kinc_g4_vertex_buffer_stride(buffer), (void **)&vertices, D3DLOCK_DISCARD));
return vertices;
}
void kinc_g4_vertex_buffer_unlock_all(kinc_g4_vertex_buffer_t *buffer) {
kinc_microsoft_affirm(buffer->impl.vb->Unlock());
}
void kinc_g4_vertex_buffer_unlock(kinc_g4_vertex_buffer_t *buffer, int count) {
kinc_microsoft_affirm(buffer->impl.vb->Unlock());
}
int kinc_internal_g4_vertex_buffer_set(kinc_g4_vertex_buffer_t *buffer, int offset) {
buffer->impl._offset = offset;
if (buffer->impl.instanceDataStepRate == 0) {
kinc_internal_current_vertex_buffer = buffer;
}
else {
kinc_microsoft_affirm(device->SetStreamSourceFreq(offset, (D3DSTREAMSOURCE_INSTANCEDATA | buffer->impl.instanceDataStepRate)));
}
kinc_microsoft_affirm(device->SetStreamSource(offset, buffer->impl.vb, 0, kinc_g4_vertex_buffer_stride(buffer)));
return 0;
}
void kinc_internal_vertex_buffer_unset(struct kinc_g4_vertex_buffer *buffer) {
if (kinc_internal_current_vertex_buffer == buffer) {
kinc_microsoft_affirm(device->SetStreamSource(0, NULL, 0, 0));
kinc_internal_current_vertex_buffer = NULL;
}
}
int kinc_g4_vertex_buffer_count(kinc_g4_vertex_buffer_t *buffer) {
return buffer->impl.myCount;
}
int kinc_g4_vertex_buffer_stride(kinc_g4_vertex_buffer_t *buffer) {
return buffer->impl.myStride;
}