mirror of
https://github.com/quelsolaar/MergeSource
synced 2025-02-01 09:58:42 -05:00
70 lines
2.1 KiB
C
70 lines
2.1 KiB
C
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include "hxa.h"
|
|
#include "hxa_utils.h"
|
|
|
|
#define FALSE 0
|
|
#define TRUE !FALSE
|
|
|
|
|
|
void hxa_util_node_vertex_purge(HXANode *node)
|
|
{
|
|
unsigned int type_size[] = {sizeof(hxa_uint8), sizeof(hxa_int32), sizeof(float), sizeof(double)};
|
|
unsigned int i, j, new_vertex_length, unit_size;
|
|
HXALayer *layer, l;
|
|
hxa_uint8 *new_buffer;
|
|
int r, *remap;
|
|
if(node->type != HXA_NT_GEOMETRY)
|
|
return;
|
|
remap = malloc((sizeof *remap) * node->content.geometry.vertex_count);
|
|
for(i = 0; i < node->content.geometry.vertex_count; i++)
|
|
remap[i] = 0;
|
|
layer = node->content.geometry.corner_stack.layers;
|
|
for(i = 0; i < node->content.geometry.edge_corner_count; i++)
|
|
{
|
|
r = layer->data.int32_data[i];
|
|
if(r < 0)
|
|
r = -1 - r;
|
|
remap[r] = 1;
|
|
}
|
|
for(new_vertex_length = i = 0; i < node->content.geometry.vertex_count; i++)
|
|
if(remap[i])
|
|
new_vertex_length++;
|
|
if(node->content.geometry.vertex_count == new_vertex_length)
|
|
{
|
|
free(remap);
|
|
return;
|
|
}
|
|
for(i = 0; i < node->content.geometry.vertex_stack.layer_count; i++)
|
|
{
|
|
layer = &node->content.geometry.vertex_stack.layers[i];
|
|
unit_size = type_size[layer->type] * layer->components;
|
|
new_buffer = malloc(unit_size * new_vertex_length);
|
|
for(j = new_vertex_length = 0; j < node->content.geometry.vertex_count; j++)
|
|
if(remap[j])
|
|
memcpy(&new_buffer[new_vertex_length++ * unit_size], &layer->data.uint8_data[j * unit_size], unit_size);
|
|
free(layer->data.uint8_data);
|
|
layer->data.uint8_data = new_buffer;
|
|
}
|
|
node->content.geometry.vertex_count = new_vertex_length;
|
|
for(j = new_vertex_length = 0; j < node->content.geometry.vertex_count; j++)
|
|
if(remap[j])
|
|
remap[j] = new_vertex_length++;
|
|
layer = node->content.geometry.corner_stack.layers;
|
|
for(i = 0; i < node->content.geometry.edge_corner_count; i++)
|
|
{
|
|
r = layer->data.int32_data[i];
|
|
if(r < 0)
|
|
layer->data.int32_data[i] = -remap[-layer->data.int32_data[i] - 1] - 1;
|
|
else
|
|
layer->data.int32_data[i] = remap[layer->data.int32_data[i]];
|
|
}
|
|
}
|
|
|
|
void hxa_util_vertex_purge(HXAFile *file)
|
|
{
|
|
unsigned int i;
|
|
for(i = 0; i < file->node_count; i++)
|
|
hxa_util_node_vertex_purge(&file->node_array[i]);
|
|
} |