forked from bartvdbraak/blender
116 lines
2.9 KiB
C
116 lines
2.9 KiB
C
|
/*
|
||
|
**
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#include "v_cmd_gen.h"
|
||
|
|
||
|
#if !defined V_GENERATE_FUNC_MODE
|
||
|
|
||
|
#include "verse.h"
|
||
|
#include "vs_server.h"
|
||
|
|
||
|
typedef struct {
|
||
|
VNMFragmentType type;
|
||
|
VMatFrag frag;
|
||
|
} VSMatFrag;
|
||
|
|
||
|
typedef struct{
|
||
|
VSNodeHead head;
|
||
|
VSMatFrag *frag;
|
||
|
unsigned int frag_count;
|
||
|
} VSNodeMaterial;
|
||
|
|
||
|
VSNodeMaterial * vs_m_create_node(unsigned int owner)
|
||
|
{
|
||
|
VSNodeMaterial *node;
|
||
|
char name[48];
|
||
|
node = malloc(sizeof *node);
|
||
|
vs_add_new_node(&node->head, V_NT_MATERIAL);
|
||
|
sprintf(name, "Material_Node_%u", node->head.id);
|
||
|
create_node_head(&node->head, name, owner);
|
||
|
node->frag = NULL;
|
||
|
node->frag_count = 0;
|
||
|
return node;
|
||
|
}
|
||
|
|
||
|
void vs_m_destroy_node(VSNodeMaterial *node)
|
||
|
{
|
||
|
destroy_node_head(&node->head);
|
||
|
free(node->frag);
|
||
|
free(node);
|
||
|
}
|
||
|
|
||
|
void vs_m_subscribe(VSNodeMaterial *node)
|
||
|
{
|
||
|
uint16 i;
|
||
|
for(i = 0; i < node->frag_count; i++)
|
||
|
if(node->frag[i].type <= VN_M_FT_OUTPUT)
|
||
|
verse_send_m_fragment_create(node->head.id, (uint16)i, (uint8)node->frag[i].type, &node->frag[i].frag);
|
||
|
}
|
||
|
|
||
|
void vs_m_unsubscribe(VSNodeMaterial *node)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
static void callback_send_m_fragment_create(void *user, VNodeID node_id, VNMFragmentID frag_id, uint8 type, VMatFrag *fragment)
|
||
|
{
|
||
|
unsigned int count;
|
||
|
uint16 i;
|
||
|
VSNodeMaterial *node;
|
||
|
node = (VSNodeMaterial *)vs_get_node(node_id, V_NT_MATERIAL);
|
||
|
if(node == NULL)
|
||
|
return;
|
||
|
if(node->frag_count + 32 < frag_id)
|
||
|
frag_id = (uint16)-1;
|
||
|
if(frag_id == (uint16)-1)
|
||
|
for(frag_id = 0; frag_id < node->frag_count && node->frag[frag_id].type < VN_M_FT_OUTPUT + 1; frag_id++);
|
||
|
if(frag_id >= node->frag_count)
|
||
|
{
|
||
|
node->frag = realloc(node->frag, (sizeof *node->frag) * (node->frag_count + 16));
|
||
|
for(i = node->frag_count; i < (node->frag_count + 16); i++)
|
||
|
node->frag[i].type = 255;
|
||
|
node->frag_count += 16;
|
||
|
}
|
||
|
node->frag[frag_id].type = type;
|
||
|
node->frag[frag_id].frag = *fragment;
|
||
|
|
||
|
count = vs_get_subscript_count(node->head.subscribers);
|
||
|
for(i = 0; i < count; i++)
|
||
|
{
|
||
|
vs_set_subscript_session(node->head.subscribers, i);
|
||
|
verse_send_m_fragment_create(node_id, frag_id, type, fragment);
|
||
|
}
|
||
|
vs_reset_subscript_session();
|
||
|
}
|
||
|
|
||
|
static void callback_send_m_fragment_destroy(void *user, VNodeID node_id, VNMFragmentID frag_id)
|
||
|
{
|
||
|
unsigned int count, i;
|
||
|
VSNodeMaterial *node;
|
||
|
node = (VSNodeMaterial *)vs_get_node(node_id, V_NT_MATERIAL);
|
||
|
printf("callback_send_m_fragment_destroy %p\n", node);
|
||
|
if(node == NULL)
|
||
|
return;
|
||
|
if(node->frag_count <= frag_id || node->frag[frag_id].type > VN_M_FT_OUTPUT)
|
||
|
return;
|
||
|
node->frag[frag_id].type = 255;
|
||
|
count = vs_get_subscript_count(node->head.subscribers);
|
||
|
for(i = 0; i < count; i++)
|
||
|
{
|
||
|
vs_set_subscript_session(node->head.subscribers, i);
|
||
|
verse_send_m_fragment_destroy(node_id, frag_id);
|
||
|
}
|
||
|
vs_reset_subscript_session();
|
||
|
}
|
||
|
|
||
|
void vs_m_callback_init(void)
|
||
|
{
|
||
|
verse_callback_set(verse_send_m_fragment_create, callback_send_m_fragment_create, NULL);
|
||
|
verse_callback_set(verse_send_m_fragment_destroy, callback_send_m_fragment_destroy, NULL);
|
||
|
}
|
||
|
|
||
|
#endif
|