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