1
1
#include < bsp/sprite.h>
2
+ #include < bsp/entity_key_values.h>
2
3
#include < imgui_impl_shaders.h>
3
4
#include < hlviewer/assets/asset_manager.h>
5
+ #include < hlviewer/assets/asset_loader.h>
6
+ #include < hlviewer/scene_view.h>
4
7
#include " sprite_viewer.h"
5
8
6
9
namespace {
@@ -21,6 +24,8 @@ const char *s_SyncTypes[] = {
21
24
" ST_RAND" ,
22
25
};
23
26
27
+ const char *s_AvailSkies[] = {" desert" , " 2desert" , " dusk" , " night" , " alien1" , " xen8" };
28
+
24
29
template <typename E, int N>
25
30
void showEnumValue (const char *name, E value, const char *(&values)[N]) {
26
31
int v = (int )value;
@@ -57,6 +62,112 @@ SpriteBlitShader s_2DShader;
57
62
58
63
}
59
64
65
+ class SpriteViewer ::View3D {
66
+ public:
67
+ View3D (SpriteViewer &viewer)
68
+ : m_Viewer(viewer) {
69
+ try {
70
+ AssetLoader loader;
71
+ m_Level = loader.loadLevel (" assets:maps/dev/sprite_preview.bsp" );
72
+ loader.processQueue (true );
73
+
74
+ m_pView = std::make_unique<View>(*this , m_Level);
75
+ updateSky (0 );
76
+ } catch (const std::exception &e) {
77
+ m_bLoadError = true ;
78
+ m_LoadErrorText = e.what ();
79
+ }
80
+ }
81
+
82
+ void show () {
83
+ if (m_bLoadError) {
84
+ ImGui::TextUnformatted (" 3D view failed to load:" );
85
+ ImGui::TextUnformatted (m_LoadErrorText.c_str ());
86
+ } else {
87
+ if (ImGui::Combo (" Skybox" , &m_iCurSky, s_AvailSkies, (int )std::size (s_AvailSkies))) {
88
+ updateSky (m_iCurSky);
89
+ }
90
+
91
+ m_pView->showImage ();
92
+ }
93
+ }
94
+
95
+ void preRender () {
96
+ if (m_pView) {
97
+ m_pView->setFov (90 );
98
+ m_pView->renderBackBuffer ();
99
+ }
100
+ }
101
+
102
+ private:
103
+ class View : public SceneView {
104
+ public:
105
+ View3D &m_View;
106
+ ClientEntity m_Sprite;
107
+
108
+ View (View3D &view, LevelAsset &level)
109
+ : SceneView(level)
110
+ , m_View(view) {
111
+ // Set initial camera position
112
+ bsp::EntityKeyValuesDict ents (level.getLevel ().getEntitiesLump ());
113
+ int ent = ents.findEntityByName (" camera_pos" );
114
+
115
+ if (ent != -1 ) {
116
+ setCameraPos (ents[ent].get (" origin" ).asFloat3 ());
117
+ setCameraRot (ents[ent].get (" angles" ).asFloat3 ());
118
+ } else {
119
+ printw (" Sprite preview map is missing camera_pos entity" );
120
+ }
121
+ }
122
+
123
+ void addVisibleEnts () override {
124
+ switch (m_View.m_Viewer .m_pSprite ->getModel ().spriteInfo .texFormat ) {
125
+ case bsp::SPR_NORMAL: {
126
+ m_Sprite.iRenderMode = kRenderNormal ;
127
+ break ;
128
+ }
129
+ case bsp::SPR_ADDITIVE: {
130
+ m_Sprite.iRenderMode = kRenderTransAdd ;
131
+ break ;
132
+ }
133
+ case bsp::SPR_INDEXALPHA:
134
+ case bsp::SPR_ALPHATEST: {
135
+ m_Sprite.iRenderMode = kRenderTransTexture ;
136
+ break ;
137
+ }
138
+ }
139
+
140
+ m_Sprite.vOrigin = {0 , 0 , 0 };
141
+ m_Sprite.vAngles = {0 , 0 , 0 };
142
+ m_Sprite.iRenderFx = kRenderFxNone ;
143
+ m_Sprite.iFxAmount = 255 ;
144
+ m_Sprite.vFxColor = glm::ivec3 (m_View.m_Viewer .m_FgColor * 255 .0f );
145
+ m_Sprite.pModel = &m_View.m_Viewer .m_pSprite ->getModel ();
146
+ m_Sprite.flFrame = m_View.m_Viewer .m_flCurrentFrame ;
147
+ m_Sprite.flScale = 1 .0f ;
148
+
149
+ if (m_Sprite.vFxColor == glm::ivec3 (0 , 0 , 0 )) {
150
+ m_Sprite.vFxColor = glm::ivec3 (255 , 255 , 255 );
151
+ }
152
+
153
+ addEntity (&m_Sprite);
154
+ }
155
+ };
156
+
157
+ SpriteViewer &m_Viewer;
158
+ bool m_bLoadError = false ;
159
+ std::string m_LoadErrorText;
160
+
161
+ LevelAsset m_Level;
162
+ std::unique_ptr<View> m_pView;
163
+ int m_iCurSky = 0 ;
164
+
165
+ void updateSky (int idx) {
166
+ m_iCurSky = idx;
167
+ m_pView->setSkyTexture (s_AvailSkies[idx]);
168
+ }
169
+ };
170
+
60
171
SpriteViewer::SpriteViewer (std::string_view path) {
61
172
// Remove tag from path and set title
62
173
size_t tagEnd = path.find (' :' );
@@ -87,6 +198,14 @@ SpriteViewer::SpriteViewer(std::string_view path) {
87
198
}
88
199
}
89
200
201
+ void SpriteViewer::preRender () {
202
+ DialogBase::preRender ();
203
+
204
+ if (m_p3DView) {
205
+ m_p3DView->preRender ();
206
+ }
207
+ }
208
+
90
209
void SpriteViewer::showContents () {
91
210
const bsp::SpriteInfo &info = m_pSprite->getModel ().spriteInfo ;
92
211
@@ -115,6 +234,9 @@ void SpriteViewer::showContents() {
115
234
ImGui::Text (" %d/%d" , frame + 1 , info.numFrames );
116
235
}
117
236
237
+ ImGui::ColorEdit3 (" BG" , &m_BgColor.r );
238
+ ImGui::ColorEdit3 (" FG" , &m_FgColor.r );
239
+
118
240
if (ImGui::BeginTabBar (" TabBar" )) {
119
241
if (ImGui::BeginTabItem (" 2D view" )) {
120
242
show2D ();
@@ -159,15 +281,18 @@ void SpriteViewer::show2D() {
159
281
ImGui::SameLine ();
160
282
ImGui::Checkbox (" Filter" , &m_b2DFilter);
161
283
162
- ImGui::ColorEdit3 (" BG" , &m_2DBgColor.r );
163
- ImGui::ColorEdit3 (" FG" , &m_2DFgColor.r );
164
-
165
284
glm::vec2 size (info.width , info.height );
166
285
size *= m_fl2DScale;
167
286
ImGui::Image (m_p2DMaterial.get (), ImVec2 (size.x , size.y ));
168
287
}
169
288
170
- void SpriteViewer::show3D () {}
289
+ void SpriteViewer::show3D () {
290
+ if (!m_p3DView) {
291
+ m_p3DView = std::make_unique<View3D>(*this );
292
+ }
293
+
294
+ m_p3DView->show ();
295
+ }
171
296
172
297
void SpriteViewer::showInfo () {
173
298
const bsp::SpriteInfo &info = m_pSprite->getModel ().spriteInfo ;
@@ -188,7 +313,7 @@ void SpriteViewer::update2DContents() {
188
313
// Set up the framebuffer
189
314
glViewport (0 , 0 , info.width , info.height );
190
315
m_2DFramebuffer.bind (GL_FRAMEBUFFER);
191
- glClearColor (m_2DBgColor .r , m_2DBgColor .g , m_2DBgColor .b , 1 .0f );
316
+ glClearColor (m_BgColor .r , m_BgColor .g , m_BgColor .b , 1 .0f );
192
317
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
193
318
194
319
// Blending
@@ -208,7 +333,7 @@ void SpriteViewer::update2DContents() {
208
333
ShaderInstance *shaderInstance = s_2DShader.getShaderInstance (SHADER_TYPE_BLIT_IDX);
209
334
shaderInstance->enable (0 );
210
335
shaderInstance->getShader <SpriteBlitShader>().m_Frame .set (std::floor (m_flCurrentFrame));
211
- shaderInstance->getShader <SpriteBlitShader>().m_Color .set (m_2DFgColor );
336
+ shaderInstance->getShader <SpriteBlitShader>().m_Color .set (m_FgColor );
212
337
213
338
glActiveTexture (GL_TEXTURE0);
214
339
m_pSprite->getModel ().spriteMat ->getTexture (0 )->bind ();
0 commit comments