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

📄 model.h

📁 游戏编程精粹6第1章 通用编程,对入门的游戏开发者很有帮助.
💻 H
字号:
//Model loading code
/*NOTE: THIS CODE IS VERY BUGGY AND IS ONLY MEANT FOR THE PURPOSE OF DEMONSTRATING
UNIT TESTING.  DO NOT ACTUALLY USE THIS IN PRODUCTION CODE.*/

#ifndef __MODEL_H__
#define __MODEL_H__

#include <cstring>
#include <cmath>

struct vertex_t {};
struct triangle_t {};
struct mesh_t {};
struct material_t {};
struct joint_t {};

class LoadModelTest;

class model_invalid_header {};
class model_invalid_version {};
class model_invalid_type {};

enum model_type
    {
    character,
    world_level
    };

class model
    {
public:
    void load_file(const char* file_path);
    void render();
    void animate(float speed, bool loop = true);
     friend LoadModelTest;
private:
    //Utility functions used to load model file
     void parse_header_section(char* file_text);
    void parse_triangle_section(char* file_text);
    void parse_mesh_section(char* file_text);
    void parse_material_section(char* file_text);
    void parse_animation_section(char* file_text);
    void prepare_joints();
    //Loads texture from file (BMP supported)
    void load_texture(const char* file_path);
    //File info functions
    double get_version() const
        { return m_version; }
    model_type get_type() const
        { return m_model_type; }
    const char* get_name() const
        { return m_name; }
    const char* get_author() const
        { return m_author; }
    //Data information functions
    size_t get_number_of_vertices() const
        { return m_number_of_vertices; }
    size_t get_number_of_triangles() const
        { return m_number_of_triangles; }
    size_t get_number_of_meshes() const
        { return m_number_of_materials; }
    size_t get_number_of_materials() const
        { return m_number_of_materials; }
    size_t get_number_of_joints() const
        { return m_number_of_joints; }
private:
    //Private data
    double m_version;
    model_type m_model_type;
    char* m_name;
    char* m_author;
    unsigned short m_number_of_vertices;
    unsigned short m_number_of_triangles;
    unsigned short m_number_of_meshes;
    unsigned short m_number_of_materials;
    unsigned short m_number_of_joints;
    vertex_t* m_vertices;
    triangle_t* m_triangles;
    mesh_t* m_meshes;
    material_t* m_materials;
    joint_t* m_joints;
    };

void model::parse_header_section(char* file_text)
     {
     if (!file_text)
          { return; }
     if (std::strstr(file_text, "<HEADER>") == NULL)
          { throw model_invalid_header(); }
     char* version = std::strstr(file_text, "<VERSION>");
     if (!version)
          { throw model_invalid_version(); }
     m_version = std::atof(version+9);
     char* type = std::strstr(file_text, "<TYPE>");
     if (!type)
          { throw model_invalid_version(); }
     if (std::strcmp(type+6, "WorldLevel"))
          m_model_type = world_level;
     else
          m_model_type = character;
     //author
     char* author = std::strstr(file_text, "<AUTHOR>");
     if (author)
          {
          author += 7;
          char* end = std::strstr(author, "</AUTHOR>");
          m_author = new char[(end-author)+1];
          std::memset(m_author, 0, (end-author)+1);
          std::strncpy(m_author, author, end-author);
          }
     char* name = std::strstr(file_text, "<NAME>");
     if (name)
          {
          name += 6;
          char* end = std::strstr(name, "</NAME>");
          m_name = new char[(end-name)+1];
          std::memset(m_name, 0, (end-name)+1);
          std::strncpy(m_name, name, end-name);
          }
     }

#endif //__MODEL_H__

⌨️ 快捷键说明

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