/* Copyright (C) 1999-2006 Id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // // Skeletons.c // #include "skeletons.h" char *skeletonRootNames[] = { "RAVEN_ROOT", "BOX_ROOT", "BEETLE_ROOT", "ELFLORD_ROOT", "PLAGUELF_ROOT", "ELF_BACKROOT", }; int skeletonRNameOffsets[] = { 0, // RAVEN 1, // BOX 2, // BEETLE 3, // ELFLORD 4, // PLAGUE ELF 5, // CORVUS }; char *skeletonJointNames[] = { "RAVEN_LOWERBACK", // 0 "RAVEN_UPPERBACK", "RAVEN_NECK", "BOX_CENTER", // 3 "BEETLE_NECK", // 4 "BEETLE_HEAD", "PLAGUELF_BACKB", // 6 "PLAGUELF_BACKC", "PLAGUELF_NECK", "ELF_BACKB", // 9 "ELF_BACKC", "ELF_NECKB", }; int skeletonNameOffsets[] = { 0, // RAVEN 3, // BOX 4, // BEETLE -1, // ELFLORD 6, // PLAGUE ELF 9, // CORVUS }; char *skeletonEffectorNames[] = { "BEETLE_EYES", // 0 "CORVUS_EYES", // 1 }; int skeletonENameOffsets[] = { -1, // RAVEN -1, // BOX 0, // BEETLE -1, // ELFLORD 1, // PLAGUE ELF }; int numJointsInSkeleton[] = { NUM_JOINTS_RAVEN, NUM_JOINTS_BOX, NUM_JOINTS_BEETLE, NUM_JOINTS_ELFLORD, NUM_JOINTS_PLAGUE_ELF, NUM_JOINTS_CORVUS, }; int numNodesInSkeleton[] = { 2, // RAVEN 0, // BOX 1, // BEETLE -1, // ELFLORD 2, // PLAGUE ELF 2, // CORVUS }; void CreateRavenSkel(void *g_skeletalJoints, size_t jointSize, struct ArrayedListNode_s *g_jointNodes, int root); void CreateBoxSkel(void *g_skeletalJoints, size_t jointSize, struct ArrayedListNode_s *g_jointNodes, int root); void CreateBeetleSkel(void *g_skeletalJoints, size_t jointSize, ArrayedListNode_t *g_jointNodes, int rootIndex); void CreateElfLordSkel(void *g_skeletalJoints, size_t jointSize, ArrayedListNode_t *g_jointNodes, int rootIndex); void CreatePlagueElfSkel(void *g_skeletalJoints, size_t jointSize, ArrayedListNode_t *g_jointNodes, int rootIndex); CreateSkeleton_t SkeletonCreators[NUM_SKELETONS] = { CreateRavenSkel, CreateBoxSkel, CreateBeetleSkel, CreateElfLordSkel, CreatePlagueElfSkel, CreatePlagueElfSkel, // Corvus has the same structure as the Plague Elf }; void CreateRavenSkel(void *g_skeletalJoints, size_t jointSize, ArrayedListNode_t *g_jointNodes, int rootIndex) { char *root; int *children; int nodeIndex; root = (char *)g_skeletalJoints + rootIndex * jointSize; children = (int *)(root + RAVEN_HEAD * jointSize); *children = ARRAYEDLISTNODE_NULL; nodeIndex = GetFreeNode(g_jointNodes, MAX_ARRAYED_JOINT_NODES); children = (int *)(root + RAVEN_UPPERBACK * jointSize); *children = nodeIndex; g_jointNodes[nodeIndex].data = rootIndex + RAVEN_HEAD; g_jointNodes[nodeIndex].next = ARRAYEDLISTNODE_NULL; nodeIndex = GetFreeNode(g_jointNodes, MAX_ARRAYED_JOINT_NODES); children = (int *)(root + RAVEN_LOWERBACK * jointSize); *children = nodeIndex; g_jointNodes[nodeIndex].data = rootIndex + RAVEN_UPPERBACK; g_jointNodes[nodeIndex].next = ARRAYEDLISTNODE_NULL; } void CreateBoxSkel(void *g_skeletalJoints, size_t jointSize, ArrayedListNode_t *g_jointNodes, int rootIndex) { char *root; int *children; root = (char *)g_skeletalJoints + rootIndex * jointSize; children = (int *)(root + RAVEN_HEAD * jointSize); *children = ARRAYEDLISTNODE_NULL; } void CreateBeetleSkel(void *g_skeletalJoints, size_t jointSize, ArrayedListNode_t *g_jointNodes, int rootIndex) { char *root; int *children; int nodeIndex; root = (char *)g_skeletalJoints + rootIndex * jointSize; children = (int *)(root + BEETLE_HEAD * jointSize); *children = ARRAYEDLISTNODE_NULL; nodeIndex = GetFreeNode(g_jointNodes, MAX_ARRAYED_JOINT_NODES); children = (int *)(root + BEETLE_NECK * jointSize); *children = nodeIndex; g_jointNodes[nodeIndex].data = rootIndex + BEETLE_HEAD; g_jointNodes[nodeIndex].next = ARRAYEDLISTNODE_NULL; } void CreateElfLordSkel(void *g_skeletalJoints, size_t jointSize, ArrayedListNode_t *g_jointNodes, int rootIndex) { char *root; int *children; int nodeIndex; root = (char *)g_skeletalJoints + rootIndex * jointSize; children = (int *)(root + BEETLE_HEAD * jointSize); *children = ARRAYEDLISTNODE_NULL; nodeIndex = GetFreeNode(g_jointNodes, MAX_ARRAYED_JOINT_NODES); children = (int *)(root + BEETLE_NECK * jointSize); *children = nodeIndex; g_jointNodes[nodeIndex].data = rootIndex + BEETLE_HEAD; g_jointNodes[nodeIndex].next = ARRAYEDLISTNODE_NULL; } void CreatePlagueElfSkel(void *g_skeletalJoints, size_t jointSize, ArrayedListNode_t *g_jointNodes, int rootIndex) { char *root; int *children; int nodeIndex; root = (char *)g_skeletalJoints + rootIndex * jointSize; children = (int *)(root + PLAGUE_ELF_HEAD * jointSize); *children = ARRAYEDLISTNODE_NULL; nodeIndex = GetFreeNode(g_jointNodes, MAX_ARRAYED_JOINT_NODES); children = (int *)(root + PLAGUE_ELF_UPPERBACK * jointSize); *children = nodeIndex; g_jointNodes[nodeIndex].data = rootIndex + PLAGUE_ELF_HEAD; g_jointNodes[nodeIndex].next = ARRAYEDLISTNODE_NULL; nodeIndex = GetFreeNode(g_jointNodes, MAX_ARRAYED_JOINT_NODES); children = (int *)(root + PLAGUE_ELF_LOWERBACK * jointSize); *children = nodeIndex; g_jointNodes[nodeIndex].data = rootIndex + PLAGUE_ELF_UPPERBACK; g_jointNodes[nodeIndex].next = ARRAYEDLISTNODE_NULL; }