parg_buffer* parg_buffer_to_gpu(parg_buffer* cpubuf, parg_buffer_type memtype) { int nbytes = parg_buffer_length(cpubuf); void* bytes = parg_buffer_lock(cpubuf, PARG_READ); parg_buffer* gpubuf = parg_buffer_create(bytes, nbytes, memtype); parg_buffer_unlock(cpubuf); return gpubuf; }
void parg_buffer_to_file(parg_buffer* buf, const char* filepath) { FILE* f = fopen(filepath, "wb"); parg_verify(f, "Unable to open file", filepath); char* contents = parg_buffer_lock(buf, PARG_READ); fwrite(contents, 1, parg_buffer_length(buf), f); fclose(f); parg_buffer_unlock(buf); }
parg_buffer* parg_buffer_dup(parg_buffer* srcbuf, parg_buffer_type memtype) { int nbytes = parg_buffer_length(srcbuf); parg_buffer* dstbuf = parg_buffer_alloc(nbytes, memtype); void* src = parg_buffer_lock(srcbuf, PARG_READ); void* dst = parg_buffer_lock(dstbuf, PARG_WRITE); memcpy(dst, src, nbytes); parg_buffer_unlock(dstbuf); parg_buffer_unlock(srcbuf); return dstbuf; }
void parg_mesh_compute_normals(parg_mesh* mesh) { par_shapes_mesh m = {0}; int nbytes = parg_buffer_length(mesh->coords); m.points = (float*) parg_buffer_lock(mesh->coords, PARG_READ); m.triangles = (uint16_t*) parg_buffer_lock(mesh->indices, PARG_READ); m.npoints = nbytes / 12; m.ntriangles = mesh->ntriangles; par_shapes_compute_normals(&m); mesh->normals = parg_buffer_create(m.normals, nbytes, PARG_CPU); parg_buffer_unlock(mesh->coords); parg_buffer_unlock(mesh->indices); free(m.normals); }
void parg_asset_preload(parg_token id) { if (!_pngsuffix) { _pngsuffix = sdsnew(".png"); } sds filename = parg_token_to_sds(id); parg_buffer* buf = parg_buffer_from_path(filename); parg_assert(buf, "Unable to load asset"); if (sdslen(filename) > 4) { sds suffix = sdsdup(filename); sdsrange(suffix, -4, -1); if (!sdscmp(suffix, _pngsuffix)) { unsigned char* decoded; unsigned dims[3] = {0, 0, 4}; unsigned char* filedata = parg_buffer_lock(buf, PARG_READ); unsigned err = lodepng_decode_memory(&decoded, &dims[0], &dims[1], filedata, parg_buffer_length(buf), LCT_RGBA, 8); parg_assert(err == 0, "PNG decoding error"); parg_buffer_free(buf); int nbytes = dims[0] * dims[1] * dims[2]; buf = parg_buffer_alloc(nbytes + 12, PARG_CPU); int* ptr = parg_buffer_lock(buf, PARG_WRITE); *ptr++ = dims[0]; *ptr++ = dims[1]; *ptr++ = dims[2]; memcpy(ptr, decoded, nbytes); free(decoded); parg_buffer_unlock(buf); } sdsfree(suffix); } if (!_asset_registry) { _asset_registry = kh_init(assmap); } int ret; int iter = kh_put(assmap, _asset_registry, id, &ret); kh_value(_asset_registry, iter) = buf; }