3D模型obj文件导入渲染光照贴图


3D模型obj文件导入渲染光照贴图 opengl obj 着色器
资源截图
代码片段和文件信息
// Copyright 2015 Tailgo

#include “ObjLoader.h“

namespace tg
{
    struct vertex_index
    {
        int v_idx vt_idx vn_idx;
        vertex_index() {};
        vertex_index(int idx) : v_idx(idx) vt_idx(idx) vn_idx(idx) {};
        vertex_index(int vidx int vtidx int vnidx) : v_idx(vidx) vt_idx(vtidx) vn_idx(vnidx) {};
    };

    static inline bool operator<(const vertex_index& a const vertex_index& b)
    {
        if (a.v_idx != b.v_idx) return (a.v_idx < b.v_idx);
        if (a.vn_idx != b.vn_idx) return (a.vn_idx < b.vn_idx);
        if (a.vt_idx != b.vt_idx) return (a.vt_idx < b.vt_idx);

        return false;
    }

    static inline bool isNewLine(const char c) {
        return (c == ‘
‘) || (c == ‘
‘) || (c == ‘‘);
    }

    //是否为空格
    static inline bool isSpace(const char c) {
        return (c == ‘ ‘) || (c == ‘ ‘);
    }

    static inline std::string parseString(const char*& token)
    {
        std::string s;
        int b = strspn(token “  “);
        int e = strcspn(token “ 
“);
        s = std::string(&token[b] &token[e]);

        token += (e - b);
        return s;
    }

    static inline int parseInt(const char*& token)
    {
        token += strspn(token “  “);
        int i = atoi(token);
        token += strcspn(token “ 
“);
        return i;
    }

    //解析为float类型的值
    static inline float parseFloat(const char*& token)
    {
        token += strspn(token “  “);
        float f = (float)atof(token);
        token += strcspn(token “ 
“);
        return f;
    }

    static inline void parseFloat2(float& x float& y const char*& token)
    {
        x = parseFloat(token);
        y = parseFloat(token);
    }

    static inline void parseFloat3(float& x float& y float& z const char*& token)
    {
        x = parseFloat(token);
        y = parseFloat(token);
        z = parseFloat(token);
    }

    // Make index zero-base and also support relative index.
    static inline int fixIndex(int idx int n)
    {
        int i;
        if (idx > 0) {
            i = idx - 1;
        }
        else if (idx == 0) {
            i = 0;
        }
        else { // negative value = relative
            i = n + idx;
        }
        return i;
    }

    //解析面信息 i i/j/k i//k i/j
    static vertex_index parseTriple(const char* &token int vsize int vnsize int vtsize)
    {
        vertex_index vi(-1);
        vi.v_idx = fixIndex(atoi(token) vsize);
        token += strcspn(token “/ 
“);
        if (token[0] != ‘/‘) {
            return vi;
        }
        token++;
        // i//k
        if (token[0] == ‘/‘) {
            token++;
            vi.vn_idx = fixIndex(atoi(token) vnsize);
            token += strcspn(token “/ 
“);
            return vi;
        }
        // i/j/k or i/j
        vi.vt_idx = fixIndex(atoi(token) vtsize);
        token += strcspn(token “/ 
“);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)