diff --git a/.gitignore b/.gitignore index fb16718..cab984c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ __pycache__ .\#* \#* *.gch -image/*.DDS \ No newline at end of file +image/*.DDS diff --git a/Makefile b/Makefile index ace80bd..170091a 100644 --- a/Makefile +++ b/Makefile @@ -74,9 +74,10 @@ src/scenes/%.cpp: scenes/%.DAE include/scenes/%.hpp @mkdir -p $(@D) PYTHONPATH=. python -m collada.main $< $@ $(<:.DAE=.vtx) $(<:.DAE=.idx) $(notdir $(<:.DAE=.rc)) $(notdir $(<:.DAE=.mk)) +# $(BUILD_TYPE)/curve_interpolation.res \ + OBJS = \ $(BUILD_TYPE)/main.res \ - $(BUILD_TYPE)/curve_interpolation.res \ $(BUILD_TYPE)/robot_player.obj \ $(BUILD_TYPE)/cube.obj \ $(BUILD_TYPE)/main.obj \ diff --git a/collada/main.py b/collada/main.py index 7a2783a..e310c87 100644 --- a/collada/main.py +++ b/collada/main.py @@ -41,7 +41,7 @@ def render_makefile(state, f): f.write(f"IMAGES += image/{filename}.DDS\r\n".encode('ascii')) f.write(f"image/{filename}.DDS: {escaped}\r\n".encode('ascii')) - f.write('\ttexconv10.exe -nologo "$<"\r\n'.encode('ascii')) + f.write('\ttexconv10.exe -f BC1_UNORM -nologo "$<"\r\n'.encode('ascii')) f.write(f'\tmv "$(<:.{ext[1:]}=.DDS)" "$@"\r\n\r\n'.encode('ascii')) def main(): diff --git a/curve_interpolation.mk b/curve_interpolation.mk index 4669905..a6ebc4f 100644 --- a/curve_interpolation.mk +++ b/curve_interpolation.mk @@ -1,20 +1,20 @@ IMAGES += image/american_cherry.DDS image/american_cherry.DDS: C:/Program\ Files/Common\ Files/Autodesk\ Shared/Materials/Textures/1/Mats/american_cherry.png - texconv10.exe -nologo "$<" + texconv10.exe -f BC1_UNORM -nologo "$<" mv "$(<:.png=.DDS)" "$@" IMAGES += image/102.DDS image/102.DDS: C:/Program\ Files/Common\ Files/Autodesk\ Shared/Materials/Textures/3/Mats/102.png - texconv10.exe -nologo "$<" + texconv10.exe -f BC1_UNORM -nologo "$<" mv "$(<:.png=.DDS)" "$@" IMAGES += image/Finishes.Flooring.Tile.Square.Medium\ Blue.DDS image/Finishes.Flooring.Tile.Square.Medium\ Blue.DDS: C:/Program\ Files/Common\ Files/Autodesk\ Shared/Materials/Textures/3/Mats/Finishes.Flooring.Tile.Square.Medium\ Blue.png - texconv10.exe -nologo "$<" + texconv10.exe -f BC1_UNORM -nologo "$<" mv "$(<:.png=.DDS)" "$@" IMAGES += image/SiteWork.Planting.Grass.Bermuda1.DDS image/SiteWork.Planting.Grass.Bermuda1.DDS: C:/Program\ Files/Common\ Files/Autodesk\ Shared/Materials/Textures/3/Mats/SiteWork.Planting.Grass.Bermuda1.jpg - texconv10.exe -nologo "$<" + texconv10.exe -f BC1_UNORM -nologo "$<" mv "$(<:.jpg=.DDS)" "$@" diff --git a/include/collada_scene.hpp b/include/collada_scene.hpp index 62c935e..8649f9f 100644 --- a/include/collada_scene.hpp +++ b/include/collada_scene.hpp @@ -37,6 +37,8 @@ namespace collada_scene { node_instance * m_nodeInstances = NULL; + ID3D10ShaderResourceView ** m_pShaderResourceViews = NULL; + XMFLOAT4 * m_lightPositions = NULL; XMFLOAT4 * m_lightDirections = NULL; XMFLOAT4 * m_lightColors = NULL; @@ -51,6 +53,7 @@ namespace collada_scene { private: HRESULT load_layouts(); + HRESULT allocate_images(); void allocate_node_instances(); void allocate_node_instance(collada::node const * const node, node_instance * node_instance); @@ -64,6 +67,10 @@ namespace collada_scene { void render_geometries(collada::instance_geometry const * const instance_geometries, int const instance_geometries_count); + void set_material(collada::effect const& effect); + void set_color_or_texture(collada::color_or_texture const& color_or_texture, + ID3D10EffectVectorVariable * pVectorVariable, + ID3D10EffectShaderResourceVariable * pShaderResourceVariable); }; HRESULT LoadEffect(); diff --git a/main.rc b/main.rc index e51fd27..4a68417 100644 --- a/main.rc +++ b/main.rc @@ -3,7 +3,7 @@ RES_FONT_FXO RCDATA "font.fxo" RES_VOLUME_FXO RCDATA "volume.fxo" RES_BLOOM_FXO RCDATA "bloom.fxo" RES_STATIC_FXO RCDATA "static.fxo" -RES_PERLIN RCDATA "texture/perlin.data" +//RES_PERLIN RCDATA "texture/perlin.data" RES_ROBOT_PLAYER RCDATA "models/robot_player/robot_player.DDS" RES_FONT_TERMINUS_6X12 RCDATA "font/terminus_128x64_6x12.data" @@ -12,3 +12,9 @@ RES_COLLADA_FXO RCDATA "collada.fxo" RES_COLLADA_SCENE_FXO RCDATA "collada_scene.fxo" RES_MODELS_CURVE_INTERPOLATION_VTX RCDATA "scenes/curve_interpolation/curve_interpolation.vtx" RES_MODELS_CURVE_INTERPOLATION_IDX RCDATA "scenes/curve_interpolation/curve_interpolation.idx" + + +_AMERICAN_CHERRY_PNG RCDATA "image/american_cherry.DDS" +_102_PNG RCDATA "image/102.DDS" +_FINISHES_FLOORING_TILE_SQUARE_MEDIUM_BLUE_PNG RCDATA "image/Finishes.Flooring.Tile.Square.Medium Blue.DDS" +_SITEWORK_PLANTING_GRASS_BERMUDA1_JPG RCDATA "image/SiteWork.Planting.Grass.Bermuda1.DDS" diff --git a/src/collada_scene.cpp b/src/collada_scene.cpp index 9297b8a..63060cf 100644 --- a/src/collada_scene.cpp +++ b/src/collada_scene.cpp @@ -7,6 +7,7 @@ #include "print.hpp" #include "collada_scene.hpp" #include "new.hpp" +#include "render_state.hpp" extern ID3D10Device * g_pd3dDevice; extern XMVECTOR g_Eye; @@ -34,6 +35,13 @@ namespace collada_scene { ID3D10EffectVectorVariable * g_pSpecularVariable = NULL; ID3D10EffectScalarVariable * g_pShininessVariable = NULL; + ID3D10EffectVectorVariable * g_pTextureChannelVariable = NULL; + + ID3D10EffectShaderResourceVariable * g_pTexEmissionVariable = NULL; + ID3D10EffectShaderResourceVariable * g_pTexAmbientVariable = NULL; + ID3D10EffectShaderResourceVariable * g_pTexDiffuseVariable = NULL; + ID3D10EffectShaderResourceVariable * g_pTexSpecularVariable = NULL; + static inline DXGI_FORMAT dxgi_format(input_format format) { switch (format) { @@ -163,6 +171,23 @@ namespace collada_scene { } } + HRESULT scene_state::allocate_images() + { + HRESULT hr; + m_pShaderResourceViews = New(m_descriptor->images_count); + + for (int i = 0; i < m_descriptor->images_count; i++) { + image const * const image = m_descriptor->images[i]; + hr = LoadDDSTexture2D(image->resource_name, + &m_pShaderResourceViews[i]); + if (FAILED(hr)) { + return hr; + } + } + + return S_OK; + } + HRESULT scene_state::load_scene(collada::descriptor const * const descriptor) { HRESULT hr; @@ -182,6 +207,10 @@ namespace collada_scene { if (FAILED(hr)) return E_FAIL; + hr = allocate_images(); + if (FAILED(hr)) + return E_FAIL; + allocate_node_instances(); allocate_light_instances(); @@ -263,6 +292,13 @@ namespace collada_scene { g_pSpecularVariable = g_pEffect->GetVariableByName("Specular")->AsVector(); g_pShininessVariable = g_pEffect->GetVariableByName("Shininess")->AsScalar(); + g_pTextureChannelVariable = g_pEffect->GetVariableByName("TextureChannel")->AsVector(); + + g_pTexEmissionVariable = g_pEffect->GetVariableByName("TexEmission")->AsShaderResource(); + g_pTexAmbientVariable = g_pEffect->GetVariableByName("TexAmbient")->AsShaderResource(); + g_pTexDiffuseVariable = g_pEffect->GetVariableByName("TexDiffuse")->AsShaderResource(); + g_pTexSpecularVariable = g_pEffect->GetVariableByName("TexSpecular")->AsShaderResource(); + return S_OK; } @@ -340,26 +376,42 @@ namespace collada_scene { } } - static inline void SetMaterial(effect const& effect) + void scene_state::set_color_or_texture(color_or_texture const& color_or_texture, + ID3D10EffectVectorVariable * pVectorVariable, + ID3D10EffectShaderResourceVariable * pShaderResourceVariable) + { + switch (color_or_texture.type) { + case color_or_texture_type::COLOR: + pVectorVariable->SetFloatVector((float *)&color_or_texture.color); + break; + case color_or_texture_type::TEXTURE: + pShaderResourceVariable->SetResource(m_pShaderResourceViews[color_or_texture.texture.image_index]); + break; + default: + assert(false); + } + } + + void scene_state::set_material(effect const& effect) { switch (effect.type) { case effect_type::BLINN: - g_pEmissionVariable->SetFloatVector((float *)&effect.blinn.emission.color); - g_pAmbientVariable->SetFloatVector((float *)&effect.blinn.ambient.color); - g_pDiffuseVariable->SetFloatVector((float *)&effect.blinn.diffuse.color); - g_pSpecularVariable->SetFloatVector((float *)&effect.blinn.specular.color); + set_color_or_texture(effect.blinn.emission, g_pEmissionVariable, g_pTexEmissionVariable); + set_color_or_texture(effect.blinn.ambient, g_pAmbientVariable, g_pTexAmbientVariable); + set_color_or_texture(effect.blinn.diffuse, g_pDiffuseVariable, g_pTexDiffuseVariable); + set_color_or_texture(effect.blinn.specular, g_pSpecularVariable, g_pTexSpecularVariable); g_pShininessVariable->SetFloat(effect.blinn.shininess); break; case effect_type::LAMBERT: - g_pEmissionVariable->SetFloatVector((float *)&effect.lambert.emission.color); - g_pAmbientVariable->SetFloatVector((float *)&effect.lambert.ambient.color); - g_pDiffuseVariable->SetFloatVector((float *)&effect.lambert.diffuse.color); + set_color_or_texture(effect.lambert.emission, g_pEmissionVariable, g_pTexEmissionVariable); + set_color_or_texture(effect.lambert.ambient, g_pAmbientVariable, g_pTexAmbientVariable); + set_color_or_texture(effect.lambert.diffuse, g_pDiffuseVariable, g_pTexDiffuseVariable); break; case effect_type::PHONG: - g_pEmissionVariable->SetFloatVector((float *)&effect.phong.emission.color); - g_pAmbientVariable->SetFloatVector((float *)&effect.phong.ambient.color); - g_pDiffuseVariable->SetFloatVector((float *)&effect.phong.diffuse.color); - g_pSpecularVariable->SetFloatVector((float *)&effect.phong.specular.color); + set_color_or_texture(effect.phong.emission, g_pEmissionVariable, g_pTexEmissionVariable); + set_color_or_texture(effect.phong.ambient, g_pAmbientVariable, g_pTexAmbientVariable); + set_color_or_texture(effect.phong.diffuse, g_pDiffuseVariable, g_pTexDiffuseVariable); + set_color_or_texture(effect.phong.specular, g_pSpecularVariable, g_pTexSpecularVariable); g_pShininessVariable->SetFloat(effect.phong.shininess); break; case effect_type::CONSTANT: @@ -388,7 +440,14 @@ namespace collada_scene { for (int j = 0; j < instance_geometry.instance_materials_count; j++) { instance_material const& instance_material = instance_geometry.instance_materials[j]; triangles const& triangles = mesh.triangles[instance_material.element_index]; - SetMaterial(*instance_material.material->effect); + set_material(*instance_material.material->effect); + int texture_channels[4] = { + instance_material.emission.input_set, + instance_material.ambient.input_set, + instance_material.diffuse.input_set, + instance_material.specular.input_set, + }; + g_pTextureChannelVariable->SetIntVector(texture_channels); g_pTechniqueBlinn->GetPassByIndex(0)->Apply(0); g_pd3dDevice->IASetInputLayout(m_pVertexLayouts[triangles.inputs_index]); diff --git a/src/effect/collada_scene.fx b/src/effect/collada_scene.fx index 0f91ecd..a0f8713 100644 --- a/src/effect/collada_scene.fx +++ b/src/effect/collada_scene.fx @@ -75,6 +75,13 @@ float4 PS(PS_INPUT input) : SV_Target float3 color = Emission.xyz; + float3 diffuseColor; + if (TextureChannel.z >= 0) { + diffuseColor = TexDiffuse.Sample(samLinear, input.Tex).xyz; + } else { + diffuseColor = Diffuse.xyz; + } + for (int i = 0; i < 2; i++) { float3 light_dir = normalize(-LightDir[i].xyz); float diffuse_intensity = max(dot(normal, light_dir), 0.0); @@ -82,7 +89,7 @@ float4 PS(PS_INPUT input) : SV_Target float distance = length(LightPos[i].xyz - input.WPos.xyz); float attenuation = 1.0 / (0.02 * distance * distance); - color += Diffuse.xyz * diffuse_intensity * LightColor[i].xyz * attenuation; + color += diffuseColor * diffuse_intensity * LightColor[i].xyz * attenuation; } return float4(color.xyz, 1); diff --git a/src/main.cpp b/src/main.cpp index a805d1a..bc4df1a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -521,6 +521,7 @@ HRESULT LoadMesh() return hr; } + /* hr = LoadTexture3D(L"RES_PERLIN", 256, // width 256, // height @@ -533,6 +534,7 @@ HRESULT LoadMesh() print("LoadTexture2D\n"); return hr; } + */ return S_OK; } @@ -716,7 +718,7 @@ HRESULT InitBloomBuffers() HRSRC hRes = FindResource(NULL, L"RES_BLOOM_FXO", RT_RCDATA); if (hRes == NULL) { - print("FindResource RES_BLOOM_FXO\n"); + print("FindResource RES_BLOOM_FXO %d\n", hRes); return E_FAIL; } DWORD dwResSize = SizeofResource(NULL, hRes); @@ -1749,7 +1751,7 @@ void RenderVolume(float t) g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); g_pLayerVariableVolume->SetFloat(t * 0.1f); - g_pDiffuseVariableVolume->SetResource(g_pTextureShaderResourceViewPerlin); + //g_pDiffuseVariableVolume->SetResource(g_pTextureShaderResourceViewPerlin); D3D10_TECHNIQUE_DESC techDescVolume; g_pTechniqueVolume->GetDesc(&techDescVolume); @@ -1769,7 +1771,7 @@ void RenderVolumeMesh() g_pViewVariableStatic->SetMatrix((float *)&g_View); g_pProjectionVariableStatic->SetMatrix((float *)&g_Projection); - g_pDiffuseVariableStatic->SetResource(g_pTextureShaderResourceViewPerlin); + //g_pDiffuseVariableStatic->SetResource(g_pTextureShaderResourceViewPerlin); ID3D10Buffer * pVB[4] = { g_pVertexBufferCube[0], @@ -1822,7 +1824,7 @@ void Render(float t, float dt) g_pd3dDevice->ClearDepthStencilView(g_pDepthStencilView, D3D10_CLEAR_DEPTH, 1.0f, 0); // render - RenderModel(t); + //RenderModel(t); const float ClearColorZero[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; ID3D10RenderTargetView * RenderTargets[] = { diff --git a/src/render_state.cpp b/src/render_state.cpp index 496af1c..f66ba5e 100644 --- a/src/render_state.cpp +++ b/src/render_state.cpp @@ -20,7 +20,7 @@ HRESULT LoadTexture2D(const wchar_t * resourceName, // texture HRSRC hRes = FindResource(NULL, resourceName, RT_RCDATA); if (hRes == NULL) { - print("FindResource %s\n", resourceName); + printW(L"FindResource %s\n", resourceName); return -1; } DWORD dwResourceSize = SizeofResource(NULL, hRes); diff --git a/src/scenes/curve_interpolation/curve_interpolation.cpp b/src/scenes/curve_interpolation/curve_interpolation.cpp index 56db097..f7f6775 100644 --- a/src/scenes/curve_interpolation/curve_interpolation.cpp +++ b/src/scenes/curve_interpolation/curve_interpolation.cpp @@ -1398,8 +1398,8 @@ instance_light const instance_lights_node_cube[] = { }; channel const * const node_channels_node_cube[] = { - &node_channel_node_cube_translation_x, &node_channel_node_cube_translation_y, + &node_channel_node_cube_translation_x, }; node const node_node_cube = { @@ -1629,9 +1629,9 @@ instance_light const instance_lights_node_geosphere[] = { }; channel const * const node_channels_node_geosphere[] = { + &node_channel_node_geosphere_scale, &node_channel_node_geosphere_inversescaleaxisrotation, &node_channel_node_geosphere_scaleaxisrotation, - &node_channel_node_geosphere_scale, }; node const node_node_geosphere = { @@ -1669,9 +1669,9 @@ instance_light const instance_lights_node_light[] = { }; channel const * const node_channels_node_light[] = { - &node_channel_node_light_translation_z, &node_channel_node_light_translation_y, &node_channel_node_light_translation_x, + &node_channel_node_light_translation_z, }; node const node_node_light = {