mirror of https://github.com/bjornbytes/lovr.git
VertexData and TextureData properly extend Blob;
...He hates it!
This commit is contained in:
parent
22cda40163
commit
6916137dc6
|
@ -8,11 +8,12 @@
|
|||
int l_lovrDataInit(lua_State* L) {
|
||||
lua_newtable(L);
|
||||
luaL_register(L, NULL, lovrData);
|
||||
luax_registertype(L, "Blob", lovrBlob);
|
||||
luax_registertype(L, "AudioStream", lovrAudioStream);
|
||||
luax_registertype(L, "ModelData", lovrModelData);
|
||||
luax_registertype(L, "Rasterizer", lovrRasterizer);
|
||||
luax_registertype(L, "TextureData", lovrTextureData);
|
||||
luax_registertype(L, "VertexData", lovrVertexData);
|
||||
luax_extendtype(L, "Blob", "TextureData", lovrBlob, lovrTextureData);
|
||||
luax_extendtype(L, "Blob", "VertexData", lovrBlob, lovrVertexData);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -76,7 +76,6 @@ static int filesystemLoader(lua_State* L) {
|
|||
int l_lovrFilesystemInit(lua_State* L) {
|
||||
lua_newtable(L);
|
||||
luaL_register(L, NULL, lovrFilesystem);
|
||||
luax_registertype(L, "Blob", lovrBlob);
|
||||
|
||||
lua_getglobal(L, "arg");
|
||||
lua_rawgeti(L, -1, -2);
|
||||
|
|
|
@ -2,25 +2,25 @@
|
|||
#include "data/blob.h"
|
||||
|
||||
int l_lovrBlobGetFilename(lua_State* L) {
|
||||
Blob* blob = luax_checktype(L, 1, Blob);
|
||||
Blob* blob = luax_checktypeof(L, 1, Blob);
|
||||
lua_pushstring(L, blob->name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int l_lovrBlobGetPointer(lua_State* L) {
|
||||
Blob* blob = luax_checktype(L, 1, Blob);
|
||||
Blob* blob = luax_checktypeof(L, 1, Blob);
|
||||
lua_pushlightuserdata(L, blob->data);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int l_lovrBlobGetSize(lua_State* L) {
|
||||
Blob* blob = luax_checktype(L, 1, Blob);
|
||||
Blob* blob = luax_checktypeof(L, 1, Blob);
|
||||
lua_pushinteger(L, blob->size);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int l_lovrBlobGetString(lua_State* L) {
|
||||
Blob* blob = luax_checktype(L, 1, Blob);
|
||||
Blob* blob = luax_checktypeof(L, 1, Blob);
|
||||
lua_pushlstring(L, blob->data, blob->size);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -104,24 +104,6 @@ void luax_setvertex(lua_State* L, int index, VertexPointer* vertex, VertexFormat
|
|||
|
||||
//
|
||||
|
||||
int l_lovrVertexDataGetPointer(lua_State* L) {
|
||||
VertexData* vertexData = luax_checktype(L, 1, VertexData);
|
||||
lua_pushlightuserdata(L, vertexData->data.raw);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int l_lovrVertexDataGetSize(lua_State* L) {
|
||||
VertexData* vertexData = luax_checktype(L, 1, VertexData);
|
||||
lua_pushinteger(L, vertexData->count * vertexData->format.stride);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int l_lovrVertexDataGetString(lua_State* L) {
|
||||
VertexData* vertexData = luax_checktype(L, 1, VertexData);
|
||||
lua_pushlstring(L, vertexData->data.raw, vertexData->count * vertexData->format.stride);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int l_lovrVertexDataGetCount(lua_State* L) {
|
||||
VertexData* vertexData = luax_checktype(L, 1, VertexData);
|
||||
uint32_t count = vertexData->count;
|
||||
|
@ -137,7 +119,7 @@ int l_lovrVertexDataGetFormat(lua_State* L) {
|
|||
int l_lovrVertexDataGetVertex(lua_State* L) {
|
||||
VertexData* vertexData = luax_checktype(L, 1, VertexData);
|
||||
uint32_t index = (uint32_t) luaL_checkint(L, 2) - 1;
|
||||
VertexPointer vertex = { .raw = vertexData->data.bytes + index * vertexData->format.stride };
|
||||
VertexPointer vertex = { .raw = (uint8_t*) vertexData->blob.data + index * vertexData->format.stride };
|
||||
return luax_pushvertex(L, &vertex, &vertexData->format);
|
||||
}
|
||||
|
||||
|
@ -146,9 +128,9 @@ int l_lovrVertexDataSetVertex(lua_State* L) {
|
|||
uint32_t index = (uint32_t) luaL_checkint(L, 2) - 1;
|
||||
lovrAssert(index < vertexData->count, "Invalid vertex index: %d", index + 1);
|
||||
VertexFormat* format = &vertexData->format;
|
||||
VertexPointer* vertex = &vertexData->data;
|
||||
vertex->bytes += index * format->stride;
|
||||
luax_setvertex(L, 3, vertex, format);
|
||||
VertexPointer vertex = { .raw = vertexData->blob.data };
|
||||
vertex.bytes += index * format->stride;
|
||||
luax_setvertex(L, 3, &vertex, format);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -160,7 +142,7 @@ int l_lovrVertexDataGetVertexAttribute(lua_State* L) {
|
|||
lovrAssert(vertexIndex < vertexData->count, "Invalid vertex index: %d", vertexIndex + 1);
|
||||
lovrAssert(attributeIndex >= 0 && attributeIndex < format->count, "Invalid attribute index: %d", attributeIndex + 1);
|
||||
Attribute attribute = format->attributes[attributeIndex];
|
||||
VertexPointer vertex = vertexData->data;
|
||||
VertexPointer vertex = { .raw = vertexData->blob.data };
|
||||
vertex.bytes += vertexIndex * format->stride + attribute.offset;
|
||||
return luax_pushvertexattribute(L, &vertex, attribute);
|
||||
}
|
||||
|
@ -173,7 +155,7 @@ int l_lovrVertexDataSetVertexAttribute(lua_State* L) {
|
|||
lovrAssert(vertexIndex < vertexData->count, "Invalid vertex index: %d", vertexIndex + 1);
|
||||
lovrAssert(attributeIndex >= 0 && attributeIndex < format->count, "Invalid attribute index: %d", attributeIndex + 1);
|
||||
Attribute attribute = format->attributes[attributeIndex];
|
||||
VertexPointer vertex = vertexData->data;
|
||||
VertexPointer vertex = { .raw = vertexData->blob.data };
|
||||
vertex.bytes += vertexIndex * format->stride + attribute.offset;
|
||||
luax_setvertexattribute(L, 4, &vertex, attribute);
|
||||
return 0;
|
||||
|
@ -186,7 +168,7 @@ int l_lovrVertexDataSetVertices(lua_State* L) {
|
|||
uint32_t vertexCount = lua_objlen(L, 2);
|
||||
int start = luaL_optnumber(L, 3, 1) - 1;
|
||||
lovrAssert(start + vertexCount <= vertexData->count, "VertexData can only hold %d vertices", vertexData->count);
|
||||
VertexPointer vertices = vertexData->data;
|
||||
VertexPointer vertices = { .raw = vertexData->blob.data };
|
||||
vertices.bytes += start * format->stride;
|
||||
|
||||
for (uint32_t i = 0; i < vertexCount; i++) {
|
||||
|
@ -200,9 +182,6 @@ int l_lovrVertexDataSetVertices(lua_State* L) {
|
|||
}
|
||||
|
||||
const luaL_Reg lovrVertexData[] = {
|
||||
{ "getPointer", l_lovrVertexDataGetPointer },
|
||||
{ "getSize", l_lovrVertexDataGetSize },
|
||||
{ "getString", l_lovrVertexDataGetString },
|
||||
{ "getCount", l_lovrVertexDataGetCount },
|
||||
{ "getFormat", l_lovrVertexDataGetFormat },
|
||||
{ "getVertex", l_lovrVertexDataGetVertex },
|
||||
|
|
|
@ -338,7 +338,7 @@ ModelData* lovrModelDataCreate(Blob* blob) {
|
|||
|
||||
// Vertices
|
||||
for (unsigned int v = 0; v < assimpMesh->mNumVertices; v++) {
|
||||
VertexPointer vertices = modelData->vertexData->data;
|
||||
VertexPointer vertices = { .raw = modelData->vertexData->blob.data };
|
||||
vertices.bytes += vertex * modelData->vertexData->format.stride;
|
||||
|
||||
*vertices.floats++ = assimpMesh->mVertices[v].x;
|
||||
|
@ -411,7 +411,7 @@ ModelData* lovrModelDataCreate(Blob* blob) {
|
|||
for (unsigned int w = 0; w < assimpBone->mNumWeights; w++) {
|
||||
uint32_t vertexIndex = baseVertex + assimpBone->mWeights[w].mVertexId;
|
||||
float weight = assimpBone->mWeights[w].mWeight;
|
||||
VertexPointer vertices = modelData->vertexData->data;
|
||||
VertexPointer vertices = { .raw = modelData->vertexData->blob.data };
|
||||
vertices.bytes += vertexIndex * modelData->vertexData->format.stride;
|
||||
uint32_t* bones = (uint32_t*) (vertices.bytes + boneByteOffset);
|
||||
float* weights = (float*) (bones + MAX_BONES_PER_VERTEX);
|
||||
|
@ -571,7 +571,8 @@ static void aabbIterator(ModelData* modelData, ModelNode* node, float aabb[6]) {
|
|||
} else {
|
||||
index = modelData->indices.ints[primitive->drawStart + j];
|
||||
}
|
||||
vec3_init(vertex, (float*) (modelData->vertexData->data.bytes + index * modelData->vertexData->format.stride));
|
||||
VertexPointer vertices = { .raw = modelData->vertexData->blob.data };
|
||||
vec3_init(vertex, (float*) (vertices.bytes + index * modelData->vertexData->format.stride));
|
||||
mat4_transform(node->globalTransform, vertex);
|
||||
aabb[0] = MIN(aabb[0], vertex[0]);
|
||||
aabb[1] = MAX(aabb[1], vertex[0]);
|
||||
|
|
|
@ -109,7 +109,7 @@ static int parseDDS(uint8_t* data, size_t size, TextureData* textureData) {
|
|||
height = MAX(height >> 1, 1);
|
||||
}
|
||||
|
||||
textureData->data = NULL;
|
||||
textureData->blob.data = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -133,8 +133,9 @@ TextureData* lovrTextureDataGetBlank(int width, int height, uint8_t value, Textu
|
|||
textureData->width = width;
|
||||
textureData->height = height;
|
||||
textureData->format = format;
|
||||
textureData->data = memset(malloc(size), value, size);
|
||||
textureData->blob = NULL;
|
||||
textureData->blob.size = size;
|
||||
textureData->blob.data = memset(malloc(size), value, size);
|
||||
textureData->source = NULL;
|
||||
vec_init(&textureData->mipmaps);
|
||||
return textureData;
|
||||
}
|
||||
|
@ -147,8 +148,8 @@ TextureData* lovrTextureDataGetEmpty(int width, int height, TextureFormat format
|
|||
textureData->width = width;
|
||||
textureData->height = height;
|
||||
textureData->format = format;
|
||||
textureData->data = NULL;
|
||||
textureData->blob = NULL;
|
||||
textureData->blob.data = NULL;
|
||||
textureData->source = NULL;
|
||||
vec_init(&textureData->mipmaps);
|
||||
return textureData;
|
||||
}
|
||||
|
@ -160,17 +161,17 @@ TextureData* lovrTextureDataFromBlob(Blob* blob) {
|
|||
vec_init(&textureData->mipmaps);
|
||||
|
||||
if (!parseDDS(blob->data, blob->size, textureData)) {
|
||||
textureData->blob = blob;
|
||||
textureData->source = blob;
|
||||
lovrRetain(blob);
|
||||
return textureData;
|
||||
}
|
||||
|
||||
stbi_set_flip_vertically_on_load(1);
|
||||
textureData->format = FORMAT_RGBA;
|
||||
textureData->data = stbi_load_from_memory(blob->data, blob->size, &textureData->width, &textureData->height, NULL, 4);
|
||||
textureData->blob = NULL;
|
||||
textureData->blob.data = stbi_load_from_memory(blob->data, blob->size, &textureData->width, &textureData->height, NULL, 4);
|
||||
textureData->source = NULL;
|
||||
|
||||
if (!textureData->data) {
|
||||
if (!textureData->blob.data) {
|
||||
lovrThrow("Could not load texture data from '%s'", blob->name);
|
||||
free(textureData);
|
||||
return NULL;
|
||||
|
@ -180,26 +181,26 @@ TextureData* lovrTextureDataFromBlob(Blob* blob) {
|
|||
}
|
||||
|
||||
Color lovrTextureDataGetPixel(TextureData* textureData, int x, int y) {
|
||||
if (!textureData->data || textureData->format != FORMAT_RGBA) {
|
||||
if (!textureData->blob.data || textureData->format != FORMAT_RGBA) {
|
||||
return (Color) { 0, 0, 0, 0 };
|
||||
}
|
||||
|
||||
bool inside = x >= 0 && y >= 0 && x <= (textureData->width - 1) && y <= (textureData->height - 1);
|
||||
lovrAssert(inside, "getPixel coordinates must be in TextureData bounds");
|
||||
size_t offset = 4 * ((textureData->height - (y + 1)) * textureData->width + x);
|
||||
uint8_t* data = (uint8_t*) textureData->data + offset;
|
||||
uint8_t* data = (uint8_t*) textureData->blob.data + offset;
|
||||
return (Color) { data[0] / 255.f, data[1] / 255.f, data[2] / 255.f, data[3] / 255.f };
|
||||
}
|
||||
|
||||
void lovrTextureDataSetPixel(TextureData* textureData, int x, int y, Color color) {
|
||||
if (!textureData->data || textureData->format != FORMAT_RGBA) {
|
||||
if (!textureData->blob.data || textureData->format != FORMAT_RGBA) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool inside = x >= 0 && y >= 0 && x <= (textureData->width - 1) && y <= (textureData->height - 1);
|
||||
lovrAssert(inside, "setPixel coordinates must be in TextureData bounds");
|
||||
size_t offset = 4 * ((textureData->height - (y + 1)) * textureData->width + x);
|
||||
uint8_t* data = (uint8_t*) textureData->data + offset;
|
||||
uint8_t* data = (uint8_t*) textureData->blob.data + offset;
|
||||
data[0] = (uint8_t) (color.r * 255.f + .5);
|
||||
data[1] = (uint8_t) (color.g * 255.f + .5);
|
||||
data[2] = (uint8_t) (color.b * 255.f + .5);
|
||||
|
@ -220,7 +221,7 @@ bool lovrTextureDataEncode(TextureData* textureData, const char* filename) {
|
|||
int components = textureData->format == FORMAT_RGB ? 3 : 4;
|
||||
int width = textureData->width;
|
||||
int height = textureData->height;
|
||||
void* data = (uint8_t*) textureData->data + (textureData->height - 1) * textureData->width * components;
|
||||
void* data = (uint8_t*) textureData->blob.data + (textureData->height - 1) * textureData->width * components;
|
||||
size_t stride = -textureData->width * components;
|
||||
bool success = stbi_write_png_to_func(writeCallback, file, width, height, components, data, stride);
|
||||
lovrFileClose(file);
|
||||
|
@ -229,8 +230,7 @@ bool lovrTextureDataEncode(TextureData* textureData, const char* filename) {
|
|||
|
||||
void lovrTextureDataDestroy(void* ref) {
|
||||
TextureData* textureData = ref;
|
||||
lovrRelease(textureData->blob);
|
||||
lovrRelease(textureData->source);
|
||||
vec_deinit(&textureData->mipmaps);
|
||||
free(textureData->data);
|
||||
free(textureData);
|
||||
lovrBlobDestroy(ref);
|
||||
}
|
||||
|
|
|
@ -34,11 +34,10 @@ typedef struct {
|
|||
typedef vec_t(Mipmap) vec_mipmap_t;
|
||||
|
||||
typedef struct {
|
||||
Ref ref;
|
||||
Blob blob;
|
||||
int width;
|
||||
int height;
|
||||
void* data;
|
||||
Blob* blob;
|
||||
Blob* source;
|
||||
TextureFormat format;
|
||||
vec_mipmap_t mipmaps;
|
||||
} TextureData;
|
||||
|
|
|
@ -16,7 +16,7 @@ void vertexFormatAppend(VertexFormat* format, const char* name, AttributeType ty
|
|||
}
|
||||
|
||||
VertexData* lovrVertexDataCreate(uint32_t count, VertexFormat* format, bool allocate) {
|
||||
VertexData* vertexData = lovrAlloc(sizeof(VertexData), lovrVertexDataDestroy);
|
||||
VertexData* vertexData = lovrAlloc(sizeof(VertexData), lovrBlobDestroy);
|
||||
if (!vertexData) return NULL;
|
||||
|
||||
if (format) {
|
||||
|
@ -31,20 +31,13 @@ VertexData* lovrVertexDataCreate(uint32_t count, VertexFormat* format, bool allo
|
|||
}
|
||||
|
||||
vertexData->count = count;
|
||||
vertexData->data.raw = NULL;
|
||||
vertexData->blob.data = NULL;
|
||||
|
||||
if (allocate) {
|
||||
vertexData->data.raw = malloc(format->stride * count);
|
||||
memset(vertexData->data.raw, 0, format->stride * count);
|
||||
size_t size = format->stride * count;
|
||||
vertexData->blob.data = calloc(1, size);
|
||||
vertexData->blob.size = size;
|
||||
}
|
||||
|
||||
return vertexData;
|
||||
}
|
||||
|
||||
void lovrVertexDataDestroy(void* ref) {
|
||||
VertexData* vertexData = ref;
|
||||
if (vertexData->data.raw) {
|
||||
free(vertexData->data.raw);
|
||||
}
|
||||
free(vertexData);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "util.h"
|
||||
#include "blob.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
@ -39,9 +40,8 @@ typedef union {
|
|||
} IndexPointer;
|
||||
|
||||
typedef struct {
|
||||
Ref ref;
|
||||
Blob blob;
|
||||
VertexFormat format;
|
||||
VertexPointer data;
|
||||
uint32_t count;
|
||||
} VertexData;
|
||||
|
||||
|
@ -49,4 +49,3 @@ void vertexFormatInit(VertexFormat* format);
|
|||
void vertexFormatAppend(VertexFormat* format, const char* name, AttributeType type, int count);
|
||||
|
||||
VertexData* lovrVertexDataCreate(uint32_t count, VertexFormat* format, bool allocate);
|
||||
void lovrVertexDataDestroy(void* ref);
|
||||
|
|
|
@ -230,8 +230,9 @@ VertexPointer lovrMeshMap(Mesh* mesh, int start, size_t count, bool read, bool w
|
|||
mesh->isMapped = true;
|
||||
mesh->mapStart = start;
|
||||
mesh->mapCount = count;
|
||||
void* p = mesh->vertexData->data.bytes + start * mesh->vertexData->format.stride;
|
||||
return (VertexPointer) { .raw = p };
|
||||
VertexPointer pointer = { .raw = mesh->vertexData->blob.data };
|
||||
pointer.bytes += start * mesh->vertexData->format.stride;
|
||||
return pointer;
|
||||
#else
|
||||
if (mesh->isMapped) {
|
||||
lovrMeshUnmap(mesh);
|
||||
|
@ -246,8 +247,9 @@ VertexPointer lovrMeshMap(Mesh* mesh, int start, size_t count, bool read, bool w
|
|||
access |= write ? GL_MAP_WRITE_BIT : 0;
|
||||
access |= (write && start == 0 && count == mesh->vertexData->count) ? GL_MAP_INVALIDATE_BUFFER_BIT : 0;
|
||||
lovrGraphicsBindVertexBuffer(mesh->vbo);
|
||||
mesh->vertexData->data.raw = glMapBufferRange(GL_ARRAY_BUFFER, start * stride, count * stride, access);
|
||||
return mesh->vertexData->data;
|
||||
VertexPointer pointer;
|
||||
pointer.raw = glMapBufferRange(GL_ARRAY_BUFFER, start * stride, count * stride, access);
|
||||
return pointer;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -263,7 +265,8 @@ void lovrMeshUnmap(Mesh* mesh) {
|
|||
size_t stride = mesh->vertexData->format.stride;
|
||||
size_t start = mesh->mapStart * stride;
|
||||
size_t count = mesh->mapCount * stride;
|
||||
glBufferSubData(GL_ARRAY_BUFFER, start, count, mesh->vertexData->data.bytes + start);
|
||||
VertexPointer vertices = { .raw = mesh->vertexData->blob.data };
|
||||
glBufferSubData(GL_ARRAY_BUFFER, start, count, vertices.bytes + start);
|
||||
#else
|
||||
glUnmapBuffer(GL_ARRAY_BUFFER);
|
||||
#endif
|
||||
|
|
|
@ -61,7 +61,7 @@ Model* lovrModelCreate(ModelData* modelData) {
|
|||
|
||||
model->mesh = lovrMeshCreate(modelData->vertexData->count, &modelData->vertexData->format, MESH_TRIANGLES, MESH_STATIC);
|
||||
VertexPointer vertices = lovrMeshMap(model->mesh, 0, modelData->vertexData->count, false, true);
|
||||
memcpy(vertices.raw, modelData->vertexData->data.raw, modelData->vertexData->count * modelData->vertexData->format.stride);
|
||||
memcpy(vertices.raw, modelData->vertexData->blob.data, modelData->vertexData->count * modelData->vertexData->format.stride);
|
||||
lovrMeshUnmap(model->mesh);
|
||||
lovrMeshSetVertexMap(model->mesh, modelData->indices.raw, modelData->indexCount);
|
||||
lovrMeshSetRangeEnabled(model->mesh, true);
|
||||
|
|
|
@ -134,7 +134,7 @@ void lovrTextureReplacePixels(Texture* texture, TextureData* textureData, int sl
|
|||
// validation
|
||||
}
|
||||
|
||||
if (!textureData->data) {
|
||||
if (!textureData->blob.data) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -160,11 +160,11 @@ void lovrTextureReplacePixels(Texture* texture, TextureData* textureData, int sl
|
|||
switch (texture->type) {
|
||||
case TEXTURE_2D:
|
||||
case TEXTURE_CUBE:
|
||||
glTexSubImage2D(binding, 0, 0, 0, textureData->width, textureData->height, glFormat, GL_UNSIGNED_BYTE, textureData->data);
|
||||
glTexSubImage2D(binding, 0, 0, 0, textureData->width, textureData->height, glFormat, GL_UNSIGNED_BYTE, textureData->blob.data);
|
||||
break;
|
||||
case TEXTURE_ARRAY:
|
||||
case TEXTURE_VOLUME:
|
||||
glTexSubImage3D(binding, 0, 0, 0, slice, textureData->width, textureData->height, 1, glFormat, GL_UNSIGNED_BYTE, textureData->data);
|
||||
glTexSubImage3D(binding, 0, 0, 0, slice, textureData->width, textureData->height, 1, glFormat, GL_UNSIGNED_BYTE, textureData->blob.data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -597,7 +597,7 @@ static ModelData* openvrControllerNewModelData(Controller* controller) {
|
|||
|
||||
modelData->vertexData = lovrVertexDataCreate(vrModel->unVertexCount, &format, true);
|
||||
|
||||
float* vertices = modelData->vertexData->data.floats;
|
||||
float* vertices = (float*) modelData->vertexData->blob.data;
|
||||
int vertex = 0;
|
||||
for (size_t i = 0; i < vrModel->unVertexCount; i++) {
|
||||
float* position = vrModel->rVertexData[i].vPosition.v;
|
||||
|
@ -647,7 +647,7 @@ static ModelData* openvrControllerNewModelData(Controller* controller) {
|
|||
// Material
|
||||
RenderModel_TextureMap_t* vrTexture = state.deviceTextures[id];
|
||||
TextureData* textureData = lovrTextureDataGetBlank(vrTexture->unWidth, vrTexture->unHeight, 0, FORMAT_RGBA);
|
||||
memcpy(textureData->data, vrTexture->rubTextureMapData, vrTexture->unWidth * vrTexture->unHeight * 4);
|
||||
memcpy(textureData->blob.data, vrTexture->rubTextureMapData, vrTexture->unWidth * vrTexture->unHeight * 4);
|
||||
|
||||
vec_init(&modelData->textures);
|
||||
vec_push(&modelData->textures, NULL);
|
||||
|
|
Loading…
Reference in New Issue