model-pbr.cpp
3.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
* Copyright (c) 2020 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
// CLASS HEADER
#include "model-pbr.h"
// EXTERNAL INCLUDES
#include <dali/devel-api/adaptor-framework/file-loader.h>
#include <string.h>
#include <cstdio>
// INTERNAL INCLUDES
#include "obj-loader.h"
namespace
{
const int SEGMENTS = 16;
struct Vertices
{
Vector<Vector3> positions;
Vector<Vector3> normals;
Vector<Vector3> tangents;
Vector<Vector2> texCoords;
};
} // namespace
ModelPbr::ModelPbr()
{
}
ModelPbr::~ModelPbr()
{
}
void ModelPbr::Init(Shader shader, const std::string& modelUrl, const Vector3& position, const Vector3& size)
{
Geometry geometry;
geometry = CreateGeometry(modelUrl);
Renderer renderer = Renderer::New(geometry, shader);
if(mTextureSet)
{
renderer.SetTextures(mTextureSet);
}
// Face culling is enabled to hide the backwards facing sides of the model
// This is sufficient to render a single object; for more complex scenes depth-testing might be required
renderer.SetProperty(Renderer::Property::DEPTH_TEST_MODE, DepthTestMode::ON);
renderer.SetProperty(Renderer::Property::DEPTH_WRITE_MODE, DepthWriteMode::ON);
renderer.SetProperty(Renderer::Property::DEPTH_FUNCTION, DepthFunction::LESS_EQUAL);
renderer.SetProperty(Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::BACK);
mActor = Actor::New();
mActor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
mActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
mActor.SetProperty(Actor::Property::POSITION, position);
mActor.SetProperty(Actor::Property::SIZE, size);
mActor.AddRenderer(renderer);
}
/**
* Set texture and sampler
*/
void ModelPbr::InitTexture(Texture albedoM, Texture normalR, Texture texDiffuse, Texture texSpecular)
{
mTextureSet = TextureSet::New();
mTextureSet.SetTexture(0u, albedoM);
mTextureSet.SetTexture(1u, normalR);
mTextureSet.SetTexture(2u, texDiffuse);
mTextureSet.SetTexture(3u, texSpecular);
Sampler sampler = Sampler::New();
sampler.SetWrapMode(WrapMode::CLAMP_TO_EDGE, WrapMode::CLAMP_TO_EDGE, WrapMode::CLAMP_TO_EDGE);
sampler.SetFilterMode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR);
mTextureSet.SetSampler(3, sampler);
}
Actor& ModelPbr::GetActor()
{
return mActor;
}
/**
* Create geometry from OBJ path file
*/
Geometry ModelPbr::CreateGeometry(const std::string& url)
{
std::streampos fileSize;
Dali::Vector<char> fileContent;
Geometry geometry;
if(FileLoader::ReadFile(url, fileSize, fileContent, FileLoader::TEXT))
{
PbrDemo::ObjLoader objLoader;
objLoader.ClearArrays();
objLoader.LoadObject(fileContent.Begin(), fileSize);
geometry = objLoader.CreateGeometry(PbrDemo::ObjLoader::TEXTURE_COORDINATES | PbrDemo::ObjLoader::TANGENTS, true);
}
return geometry;
}