⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 node.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * The 3D Studio File Format Library * Copyright (C) 1996-2001 by J.E. Hoffmann <je-h@gmx.net> * All rights reserved. * * This program is  free  software;  you can redistribute it and/or modify it * under the terms of the  GNU Lesser General Public License  as published by  * the  Free Software Foundation;  either version 2.1 of the License,  or (at  * your option) any later version. * * This  program  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 Lesser General Public   * License for more details. * * You should  have received  a copy of the GNU Lesser General Public License * along with  this program;  if not, write to the  Free Software Foundation, * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: node.cpp 1563 2003-01-24 15:12:54Z robert $ */#define LIB3DS_EXPORT#include "node.h"#include "file.h"#include "readwrite.h"#include "chunk.h"#include "matrix.h"#include <stdlib.h>#include <string.h>#include <math.h>#include "config.h"#ifdef WITH_DMALLOC#include <dmalloc.h>#endif/*! * \defgroup node Animation Nodes * * \author J.E. Hoffmann <je-h@gmx.net> *//*! * \ingroup node */Lib3dsNode*lib3ds_node_new_ambient(){  Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);  node->type=LIB3DS_AMBIENT_NODE;  lib3ds_matrix_identity(node->matrix);  return(node);}/*! * \ingroup node */Lib3dsNode*lib3ds_node_new_object(){  Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);  node->type=LIB3DS_OBJECT_NODE;  lib3ds_matrix_identity(node->matrix);  return(node);}/*! * \ingroup node */Lib3dsNode*lib3ds_node_new_camera(){  Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);  node->type=LIB3DS_CAMERA_NODE;  lib3ds_matrix_identity(node->matrix);  return(node);}/*! * \ingroup node */Lib3dsNode*lib3ds_node_new_target(){  Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);  node->type=LIB3DS_TARGET_NODE;  lib3ds_matrix_identity(node->matrix);  return(node);}/*! * \ingroup node */Lib3dsNode*lib3ds_node_new_light(){  Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);  node->type=LIB3DS_LIGHT_NODE;  lib3ds_matrix_identity(node->matrix);  return(node);}/*! * \ingroup node */Lib3dsNode*lib3ds_node_new_spot(){  Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);  node->type=LIB3DS_SPOT_NODE;  lib3ds_matrix_identity(node->matrix);  return(node);}static voidfree_node_and_childs(Lib3dsNode *node){  ASSERT(node);  switch (node->type) {    case LIB3DS_UNKNOWN_NODE:      break;    case LIB3DS_AMBIENT_NODE:      {        Lib3dsAmbientData *n=&node->data.ambient;        lib3ds_lin3_track_free_keys(&n->col_track);      }      break;    case LIB3DS_OBJECT_NODE:      {        Lib3dsObjectData *n=&node->data.object;        lib3ds_lin3_track_free_keys(&n->pos_track);        lib3ds_quat_track_free_keys(&n->rot_track);        lib3ds_lin3_track_free_keys(&n->scl_track);        lib3ds_bool_track_free_keys(&n->hide_track);        lib3ds_morph_track_free_keys(&n->morph_track);      }      break;    case LIB3DS_CAMERA_NODE:      {        Lib3dsCameraData *n=&node->data.camera;        lib3ds_lin3_track_free_keys(&n->pos_track);        lib3ds_lin1_track_free_keys(&n->fov_track);        lib3ds_lin1_track_free_keys(&n->roll_track);      }      break;    case LIB3DS_TARGET_NODE:      {        Lib3dsTargetData *n=&node->data.target;        lib3ds_lin3_track_free_keys(&n->pos_track);      }      break;    case LIB3DS_LIGHT_NODE:      {        Lib3dsLightData *n=&node->data.light;        lib3ds_lin3_track_free_keys(&n->pos_track);        lib3ds_lin3_track_free_keys(&n->col_track);        lib3ds_lin1_track_free_keys(&n->hotspot_track);        lib3ds_lin1_track_free_keys(&n->falloff_track);        lib3ds_lin1_track_free_keys(&n->roll_track);      }      break;    case LIB3DS_SPOT_NODE:      {        Lib3dsSpotData *n=&node->data.spot;        lib3ds_lin3_track_free_keys(&n->pos_track);      }      break;  }  {    Lib3dsNode *p,*q;    for (p=node->childs; p; p=q) {      q=p->next;      free_node_and_childs(p);    }  }  node->type=LIB3DS_UNKNOWN_NODE;  free(node);}/*! * \ingroup node */voidlib3ds_node_free(Lib3dsNode *node){  ASSERT(node);  free_node_and_childs(node);}/*! * \ingroup node */voidlib3ds_node_eval(Lib3dsNode *node, Lib3dsFloat t){  ASSERT(node);  switch (node->type) {    case LIB3DS_UNKNOWN_NODE:      {        ASSERT(LIB3DS_FALSE);      }      break;    case LIB3DS_AMBIENT_NODE:      {        Lib3dsAmbientData *n=&node->data.ambient;        if (node->parent) {          lib3ds_matrix_copy(node->matrix, node->parent->matrix);        }        else {          lib3ds_matrix_identity(node->matrix);        }        lib3ds_lin3_track_eval(&n->col_track, n->col, t);      }      break;    case LIB3DS_OBJECT_NODE:      {        Lib3dsMatrix M;        Lib3dsObjectData *n=&node->data.object;        lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);        lib3ds_quat_track_eval(&n->rot_track, n->rot, t);        lib3ds_lin3_track_eval(&n->scl_track, n->scl, t);        lib3ds_bool_track_eval(&n->hide_track, &n->hide, t);        lib3ds_morph_track_eval(&n->morph_track, n->morph, t);        lib3ds_matrix_identity(M);        lib3ds_matrix_translate(M, n->pos);        lib3ds_matrix_rotate(M, n->rot);        lib3ds_matrix_scale(M, n->scl);                if (node->parent) {          lib3ds_matrix_mul(node->matrix, node->parent->matrix, M);        }        else {          lib3ds_matrix_copy(node->matrix, M);        }      }      break;    case LIB3DS_CAMERA_NODE:      {        Lib3dsCameraData *n=&node->data.camera;        lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);        lib3ds_lin1_track_eval(&n->fov_track, &n->fov, t);        lib3ds_lin1_track_eval(&n->roll_track, &n->roll, t);        if (node->parent) {          lib3ds_matrix_copy(node->matrix, node->parent->matrix);        }        else {          lib3ds_matrix_identity(node->matrix);        }        lib3ds_matrix_translate(node->matrix, n->pos);      }      break;    case LIB3DS_TARGET_NODE:      {        Lib3dsTargetData *n=&node->data.target;        lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);        if (node->parent) {          lib3ds_matrix_copy(node->matrix, node->parent->matrix);        }        else {          lib3ds_matrix_identity(node->matrix);        }        lib3ds_matrix_translate(node->matrix, n->pos);      }      break;    case LIB3DS_LIGHT_NODE:      {        Lib3dsLightData *n=&node->data.light;        lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);        lib3ds_lin3_track_eval(&n->col_track, n->col, t);        lib3ds_lin1_track_eval(&n->hotspot_track, &n->hotspot, t);        lib3ds_lin1_track_eval(&n->falloff_track, &n->falloff, t);        lib3ds_lin1_track_eval(&n->roll_track, &n->roll, t);        if (node->parent) {          lib3ds_matrix_copy(node->matrix, node->parent->matrix);        }        else {          lib3ds_matrix_identity(node->matrix);        }        lib3ds_matrix_translate(node->matrix, n->pos);      }      break;    case LIB3DS_SPOT_NODE:      {        Lib3dsSpotData *n=&node->data.spot;        lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);        if (node->parent) {          lib3ds_matrix_copy(node->matrix, node->parent->matrix);        }        else {          lib3ds_matrix_identity(node->matrix);        }        lib3ds_matrix_translate(node->matrix, n->pos);      }      break;  }  {    Lib3dsNode *p;    for (p=node->childs; p!=0; p=p->next) {      lib3ds_node_eval(p, t);    }  }}/*! * \ingroup node */Lib3dsNode*lib3ds_node_by_name(Lib3dsNode *node, const char* name, Lib3dsNodeTypes type){  Lib3dsNode *p,*q;  for (p=node->childs; p!=0; p=p->next) {    if ((p->type==type) && (strcmp(p->name, name)==0)) {      return(p);    }    q=lib3ds_node_by_name(p, name, type);    if (q) {      return(q);    }  }  return(0);}/*! * \ingroup node */Lib3dsNode*lib3ds_node_by_id(Lib3dsNode *node, Lib3dsWord node_id){  Lib3dsNode *p,*q;  for (p=node->childs; p!=0; p=p->next) {    if (p->node_id==node_id) {      return(p);    }    q=lib3ds_node_by_id(p, node_id);    if (q) {      return(q);    }  }  return(0);}static const char* node_names_table[]= {  "***Unknown***",  "Ambient",  "Object",  "Camera",  "Target",  "Light",  "Spot"};/*! * \ingroup node */voidlib3ds_node_dump(Lib3dsNode *node, Lib3dsIntd level){  Lib3dsNode *p;  char l[128];  ASSERT(node);  memset(l, ' ', 2*level);  l[2*level]=0;  if (node->type==LIB3DS_OBJECT_NODE) {    printf("%s%s [%s] (%s)\n",      l,      node->name,      node->data.object.instance,      node_names_table[node->type]    );  }  else {    printf("%s%s (%s)\n",      l,      node->name,      node_names_table[node->type]    );  }    for (p=node->childs; p!=0; p=p->next) {    lib3ds_node_dump(p, level+1);  }}/*! * \ingroup node */Lib3dsBoollib3ds_node_read(Lib3dsNode *node, Lib3dsFile *, FILE *f){  Lib3dsChunk c;  Lib3dsWord chunk;  ASSERT(node);  if (!lib3ds_chunk_read_start(&c, 0, f)) {    return(LIB3DS_FALSE);  }  switch (c.chunk) {    case LIB3DS_AMBIENT_NODE_TAG:    case LIB3DS_OBJECT_NODE_TAG:    case LIB3DS_CAMERA_NODE_TAG:    case LIB3DS_TARGET_NODE_TAG:    case LIB3DS_LIGHT_NODE_TAG:    case LIB3DS_SPOTLIGHT_NODE_TAG:    case LIB3DS_L_TARGET_NODE_TAG:      break;    default:      return(LIB3DS_FALSE);  }  while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) {    switch (chunk) {      case LIB3DS_NODE_ID:        {          node->node_id=lib3ds_word_read(f);          lib3ds_chunk_dump_info("  ID = %d", (short)node->node_id);        }        break;      case LIB3DS_NODE_HDR:        {          if (!lib3ds_string_read(node->name, 64, f)) {            return(LIB3DS_FALSE);          }          node->flags1=lib3ds_word_read(f);          node->flags2=lib3ds_word_read(f);          node->parent_id=lib3ds_word_read(f);          lib3ds_chunk_dump_info("  NAME =%s", node->name);          lib3ds_chunk_dump_info("  PARENT=%d", (short)node->parent_id);        }        break;      case LIB3DS_PIVOT:        {          if (node->type==LIB3DS_OBJECT_NODE) {            int i;            for (i=0; i<3; ++i) {              node->data.object.pivot[i]=lib3ds_float_read(f);            }          }          else {            lib3ds_chunk_unknown(chunk);          }        }        break;      case LIB3DS_INSTANCE_NAME:        {          if (node->type==LIB3DS_OBJECT_NODE) {            if (!lib3ds_string_read(node->data.object.instance, 64, f)) {              return(LIB3DS_FALSE);            }          }          else {            lib3ds_chunk_unknown(chunk);          }        }        break;      case LIB3DS_BOUNDBOX:        {          if (node->type==LIB3DS_OBJECT_NODE) {            int i;            for (i=0; i<3; ++i) {              node->data.object.bbox_min[i]=lib3ds_float_read(f);            }            for (i=0; i<3; ++i) {              node->data.object.bbox_max[i]=lib3ds_float_read(f);            }          }          else {            lib3ds_chunk_unknown(chunk);          }        }        break;      case LIB3DS_COL_TRACK_TAG:        {          Lib3dsBool result=LIB3DS_TRUE;                    switch (node->type) {            case LIB3DS_AMBIENT_NODE:              result=lib3ds_lin3_track_read(&node->data.ambient.col_track, f);              break;            case LIB3DS_LIGHT_NODE:              result=lib3ds_lin3_track_read(&node->data.light.col_track, f);              break;            default:              lib3ds_chunk_unknown(chunk);          }          if (!result) {            return(LIB3DS_FALSE);          }        }        break;      case LIB3DS_POS_TRACK_TAG:        {          Lib3dsBool result=LIB3DS_TRUE;          switch (node->type) {            case LIB3DS_OBJECT_NODE:              result=lib3ds_lin3_track_read(&node->data.object.pos_track, f);              break;            case LIB3DS_CAMERA_NODE:              result=lib3ds_lin3_track_read(&node->data.camera.pos_track, f);              break;            case LIB3DS_TARGET_NODE:              result=lib3ds_lin3_track_read(&node->data.target.pos_track, f);              break;            case LIB3DS_LIGHT_NODE:              result=lib3ds_lin3_track_read(&node->data.light.pos_track, f);              break;            case LIB3DS_SPOT_NODE:              result=lib3ds_lin3_track_read(&node->data.spot.pos_track, f);              break;            default:              lib3ds_chunk_unknown(chunk);          }          if (!result) {            return(LIB3DS_FALSE);          }        }        break;      case LIB3DS_ROT_TRACK_TAG:        {          if (node->type==LIB3DS_OBJECT_NODE) {            if (!lib3ds_quat_track_read(&node->data.object.rot_track, f)) {              return(LIB3DS_FALSE);            }          }          else {            lib3ds_chunk_unknown(chunk);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -