资源简介

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 == ‘\r‘) || (c == ‘\n‘) || (c == ‘\0‘);
    }

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

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

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

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

    //解析为float类型的值
    static inline float parseFloat(const char*& token)
    {
        token += strspn(token “ \t“);
        float f = (float)atof(token);
        token += strcspn(token “ \t\r“);
        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 “/ \t\r“);
        if (token[0] != ‘/‘) {
            return vi;
        }
        token++;
        // i//k
        if (token[0] == ‘/‘) {
            token++;
            vi.vn_idx = fixIndex(atoi(token) vnsize);
            token += strcspn(token “/ \t\r“);
            return vi;
        }
        // i/j/k or i/j
        vi.vt_idx = fixIndex(atoi(token) vtsize);
        token += strcspn(token “/ \t\r“);

评论

共有 条评论