Giter Site home page Giter Site logo

fyrox-tutorials's People

Contributors

minusgix avatar mrdimas avatar pcbeard avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fyrox-tutorials's Issues

Update to latest rg3d

Tutorials are quite outdated already, because engine changing rapidly. There were few breaking changes in the engine, but overall it should be easy to update the code to compile with latest engine.

Tutorial 1 doesn't seem to work

I'm following the instructions here

Here is a repository showing where I'm up to: https://github.com/shadow7412/Fyrox-tutorial1

Basically, when I get to the end of the "Player and camera controller" section, I'm told I should be able to run the build and see a world and character, but I'm still being presented with a black screen (as per the end of the "Framework" section).

The only thing that jumps out at me from the logs is "Insufficient atlas size". Could that be the cause?
I'm using CLion, and rust v 1.65.0 in case that's relevant.

Here are the logs

/home/[REDACTED]/.cargo/bin/cargo run --color=always
warning: unused import: `WindowEvent`
 --> src/main.rs:7:20
  |
7 |     event::{Event, WindowEvent},
  |                    ^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused variable: `context`
  --> src/main.rs:59:26
   |
59 |     fn update(&mut self, context: &mut PluginContext, _: &mut ControlFlow) {
   |                          ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_context`
   |
   = note: `#[warn(unused_variables)]` on by default

warning: unused variable: `event`
  --> src/main.rs:65:9
   |
65 |         event: &Event<()>,
   |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_event`

warning: fields `scene`, `level` and `player` are never read
  --> src/main.rs:29:5
   |
28 | struct Game {
   |        ---- fields in this struct
29 |     scene: Handle<Scene>,
   |     ^^^^^
30 |     level: Level,
   |     ^^^^^
31 |     player: Player,
   |     ^^^^^^
   |
   = note: `#[warn(dead_code)]` on by default

warning: `rpg-tutorial` (bin "rpg-tutorial") generated 4 warnings
    Finished dev [unoptimized + debuginfo] target(s) in 0.08s
     Running `target/debug/rpg-tutorial`
[INFO]: Supported GL Extensions: {"GL_ARB_tessellation_shader", "GL_AMD_framebuffer_multisample_advanced", "GL_ARB_bindless_texture", "GL_EXT_EGL_image_storage", "GL_KHR_robustness", "GL_ARB_texture_query_lod", "GL_EXT_abgr", "GL_EXT_blend_equation_separate", "GL_ARB_shading_language_packing", "GL_NV_vdpau_interop", "GL_ARB_vertex_buffer_object", "GL_KHR_texture_compression_astc_sliced_3d", "GL_EXT_texture_snorm", "GL_ARB_texture_rgb10_a2ui", "GL_EXT_window_rectangles", "GL_ARB_shader_image_load_store", "GL_ARB_texture_float", "GL_EXT_memory_object", "GL_ATI_texture_float", "GL_EXT_provoking_vertex", "GL_ARB_arrays_of_arrays", "GL_ARB_derivative_control", "GL_ARB_instanced_arrays", "GL_S3_s3tc", "GL_ARB_parallel_shader_compile", "GL_ARB_pixel_buffer_object", "GL_ARB_get_texture_sub_image", "GL_NV_packed_depth_stencil", "GL_ARB_texture_filter_anisotropic", "GL_ARB_shader_atomic_counters", "GL_ARB_gpu_shader_int64", "GL_ARB_shader_storage_buffer_object", "GL_ARB_texture_barrier", "GL_ARB_depth_buffer_float", "GL_ATI_blend_equation_separate", "GL_EXT_semaphore", "GL_ARB_ES2_compatibility", "GL_ARB_explicit_attrib_location", "GL_ARB_conservative_depth", "GL_AMD_vertex_shader_layer", "GL_ARB_separate_shader_objects", "GL_ARB_compute_variable_group_size", "GL_ARB_texture_cube_map_array", "GL_EXT_shader_image_load_formatted", "GL_ARB_half_float_pixel", "GL_KHR_texture_compression_astc_ldr", "GL_ARB_draw_buffers", "GL_KHR_parallel_shader_compile", "GL_ARB_draw_buffers_blend", "GL_ARB_explicit_uniform_location", "GL_ARB_sampler_objects", "GL_ARB_texture_view", "GL_ARB_conditional_render_inverted", "GL_EXT_texture_filter_anisotropic", "GL_NVX_gpu_memory_info", "GL_EXT_texture_sRGB_R8", "GL_IBM_multimode_draw_arrays", "GL_EXT_draw_instanced", "GL_EXT_texture_sRGB_RG8", "GL_AMD_multi_draw_indirect", "GL_ARB_texture_buffer_object", "GL_ARB_sample_shading", "GL_ARB_texture_rg", "GL_ARB_blend_func_extended", "GL_ATI_meminfo", "GL_EXT_EGL_sync", "GL_EXT_shader_samples_identical", "GL_EXT_pixel_buffer_object", "GL_EXT_vertex_attrib_64bit", "GL_EXT_demote_to_helper_invocation", "GL_ARB_indirect_parameters", "GL_ARB_internalformat_query", "GL_ARB_internalformat_query2", "GL_ARB_map_buffer_alignment", "GL_AMD_depth_clamp_separate", "GL_ARB_query_buffer_object", "GL_ARB_occlusion_query2", "GL_EXT_draw_buffers2", "GL_ARB_point_sprite", "GL_ARB_vertex_array_bgra", "GL_ARB_texture_stencil8", "GL_EXT_semaphore_fd", "GL_EXT_memory_object_fd", "GL_EXT_texture_shadow_lod", "GL_EXT_texture_compression_rgtc", "GL_ARB_shader_stencil_export", "GL_ATI_texture_mirror_once", "GL_ARB_sync", "GL_ARB_sparse_texture", "GL_ANGLE_texture_compression_dxt5", "GL_ARB_framebuffer_sRGB", "GL_ARB_vertex_shader", "GL_NV_alpha_to_coverage_dither_control", "GL_ARB_vertex_attrib_64bit", "GL_ARB_shader_ballot", "GL_EXT_framebuffer_object", "GL_EXT_texture_compression_s3tc", "GL_ARB_multi_draw_indirect", "GL_ARB_polygon_offset_clamp", "GL_ARB_transform_feedback3", "GL_ARB_ES3_compatibility", "GL_AMD_performance_monitor", "GL_ARB_vertex_attrib_binding", "GL_ARB_texture_gather", "GL_ARB_shader_objects", "GL_ARB_vertex_type_10f_11f_11f_rev", "GL_ARB_invalidate_subdata", "GL_EXT_shader_image_load_store", "GL_EXT_texture_integer", "GL_ARB_transform_feedback_overflow_query", "GL_ARB_texture_query_levels", "GL_INTEL_blackhole_render", "GL_MESA_shader_integer_functions", "GL_ARB_viewport_array", "GL_NV_conditional_render", "GL_ARB_texture_swizzle", "GL_EXT_texture_array", "GL_ARB_shader_atomic_counter_ops", "GL_EXT_texture_mirror_clamp", "GL_ARB_half_float_vertex", "GL_AMD_vertex_shader_viewport_index", "GL_ARB_post_depth_coverage", "GL_ARB_clear_texture", "GL_EXT_packed_depth_stencil", "GL_ARB_clear_buffer_object", "GL_EXT_texture_sRGB", "GL_ARB_compute_shader", "GL_ARB_robustness", "GL_ARB_spirv_extensions", "GL_KHR_blend_equation_advanced", "GL_ARB_shader_viewport_layer_array", "GL_ARB_texture_non_power_of_two", "GL_EXT_vertex_array_bgra", "GL_ARB_texture_compression_rgtc", "GL_ARB_program_interface_query", "GL_ARB_clip_control", "GL_ARB_shader_texture_lod", "GL_ARB_enhanced_layouts", "GL_NV_copy_image", "GL_ARB_texture_rectangle", "GL_ARB_uniform_buffer_object", "GL_KHR_context_flush_control", "GL_AMD_shader_trinary_minmax", "GL_ARB_provoking_vertex", "GL_ARB_transform_feedback2", "GL_EXT_polygon_offset_clamp", "GL_ARB_transform_feedback_instanced", "GL_AMD_draw_buffers_blend", "GL_ARB_sparse_buffer", "GL_ARB_framebuffer_no_attachments", "GL_EXT_texture_compression_dxt1", "GL_AMD_texture_texture4", "GL_AMD_shader_stencil_export", "GL_ARB_multi_bind", "GL_ARB_direct_state_access", "GL_EXT_texture_sRGB_decode", "GL_ARB_shading_language_420pack", "GL_KHR_no_error", "GL_MESA_framebuffer_flip_y", "GL_ARB_fragment_layer_viewport", "GL_ARB_sparse_texture2", "GL_AMD_pinned_memory", "GL_ARB_shader_clock", "GL_KHR_debug", "GL_NV_shader_atomic_int64", "GL_ARB_debug_output", "GL_ARB_texture_compression_bptc", "GL_EXT_transform_feedback", "GL_ARB_cull_distance", "GL_NV_depth_clamp", "GL_ARB_sparse_texture_clamp", "GL_ARB_texture_storage", "GL_ARB_draw_instanced", "GL_EXT_framebuffer_multisample_blit_scaled", "GL_ANGLE_texture_compression_dxt3", "GL_MESA_pack_invert", "GL_ARB_framebuffer_object", "GL_ARB_copy_image", "GL_ARB_texture_multisample", "GL_ARB_shader_draw_parameters", "GL_ARB_shader_group_vote", "GL_ARB_shader_image_size", "GL_NV_compute_shader_derivatives", "GL_ARB_map_buffer_range", "GL_EXT_shader_integer_mix", "GL_EXT_texture_shared_exponent", "GL_ARB_compressed_texture_pixel_storage", "GL_ARB_texture_buffer_range", "GL_ARB_shader_precision", "GL_ARB_seamless_cube_map", "GL_EXT_framebuffer_blit", "GL_EXT_timer_query", "GL_KHR_robust_buffer_access_behavior", "GL_ARB_ES3_1_compatibility", "GL_ARB_shader_bit_encoding", "GL_AMD_conservative_depth", "GL_ARB_timer_query", "GL_OES_EGL_image", "GL_ARB_shader_subroutine", "GL_NV_texture_barrier", "GL_AMD_gpu_shader_int64", "GL_ARB_fragment_coord_conventions", "GL_ARB_pipeline_statistics_query", "GL_ARB_robust_buffer_access_behavior", "GL_EXT_texture_swizzle", "GL_ARB_seamless_cubemap_per_texture", "GL_ARB_color_buffer_float", "GL_ARB_texture_buffer_object_rgb32", "GL_ARB_fragment_shader", "GL_ARB_get_program_binary", "GL_ARB_draw_elements_base_vertex", "GL_EXT_framebuffer_multisample", "GL_ARB_vertex_array_object", "GL_EXT_framebuffer_sRGB", "GL_ARB_texture_storage_multisample", "GL_ARB_buffer_storage", "GL_ARB_gl_spirv", "GL_ARB_shading_language_include", "GL_ARB_vertex_type_2_10_10_10_rev", "GL_EXT_packed_float", "GL_ARB_base_instance", "GL_ARB_draw_indirect", "GL_MESA_texture_signed_rgba", "GL_ARB_gpu_shader_fp64", "GL_ARB_depth_clamp", "GL_AMD_query_buffer_object", "GL_ARB_texture_mirror_clamp_to_edge", "GL_ARB_ES3_2_compatibility", "GL_ARB_copy_buffer", "GL_ARB_stencil_texturing", "GL_ARB_gpu_shader5", "GL_EXT_depth_bounds_test", "GL_ARB_shader_texture_image_samples", "GL_AMD_seamless_cubemap_per_texture"}
[INFO]: Shader BlurShader_VertexShader compiled successfully!
[INFO]: Shader BlurShader_FragmentShader compiled successfully!
[INFO]: Shader BlurShader linked successfully!
[INFO]: Shader SsaoShader_VertexShader compiled successfully!
[INFO]: Shader SsaoShader_FragmentShader compiled successfully!
[INFO]: Shader SsaoShader linked successfully!
[INFO]: Shader SpotLightShader_VertexShader compiled successfully!
[INFO]: Shader SpotLightShader_FragmentShader compiled successfully!
[INFO]: Shader SpotLightShader linked successfully!
[INFO]: Shader PointLightShader_VertexShader compiled successfully!
[INFO]: Shader PointLightShader_FragmentShader compiled successfully!
[INFO]: Shader PointLightShader linked successfully!
[INFO]: Shader DirectionalLightShader_VertexShader compiled successfully!
[INFO]: Shader DirectionalLightShader_FragmentShader compiled successfully!
[INFO]: Shader DirectionalLightShader linked successfully!
[INFO]: Shader AmbientLightShader_VertexShader compiled successfully!
[INFO]: Shader AmbientLightShader_FragmentShader compiled successfully!
[INFO]: Shader AmbientLightShader linked successfully!
[INFO]: Shader FlatShader_VertexShader compiled successfully!
[INFO]: Shader FlatShader_FragmentShader compiled successfully!
[INFO]: Shader FlatShader linked successfully!
[INFO]: Shader SkyboxShader_VertexShader compiled successfully!
[INFO]: Shader SkyboxShader_FragmentShader compiled successfully!
[INFO]: Shader SkyboxShader linked successfully!
[INFO]: Shader SpotVolumetricLight_VertexShader compiled successfully!
[INFO]: Shader SpotVolumetricLight_FragmentShader compiled successfully!
[INFO]: Shader SpotVolumetricLight linked successfully!
[INFO]: Shader PointVolumetricLight_VertexShader compiled successfully!
[INFO]: Shader PointVolumetricLight_FragmentShader compiled successfully!
[INFO]: Shader PointVolumetricLight linked successfully!
[INFO]: Shader FlatShader_VertexShader compiled successfully!
[INFO]: Shader FlatShader_FragmentShader compiled successfully!
[INFO]: Shader FlatShader linked successfully!
[INFO]: Shader FlatShader_VertexShader compiled successfully!
[INFO]: Shader FlatShader_FragmentShader compiled successfully!
[INFO]: Shader FlatShader linked successfully!
[INFO]: Shader SpriteShader_VertexShader compiled successfully!
[INFO]: Shader SpriteShader_FragmentShader compiled successfully!
[INFO]: Shader SpriteShader linked successfully!
[INFO]: Shader UIShader_VertexShader compiled successfully!
[INFO]: Shader UIShader_FragmentShader compiled successfully!
[INFO]: Shader UIShader linked successfully!
[INFO]: Shader ParticleSystemShader_VertexShader compiled successfully!
[INFO]: Shader ParticleSystemShader_FragmentShader compiled successfully!
[INFO]: Shader ParticleSystemShader linked successfully!
[INFO]: Shader DebugShader_VertexShader compiled successfully!
[INFO]: Shader DebugShader_FragmentShader compiled successfully!
[INFO]: Shader DebugShader linked successfully!
[INFO]: Shader FXAAShader_VertexShader compiled successfully!
[INFO]: Shader FXAAShader_FragmentShader compiled successfully!
[INFO]: Shader FXAAShader linked successfully!
[INFO]: Shader RectangleShader_VertexShader compiled successfully!
[INFO]: Shader RectangleShader_FragmentShader compiled successfully!
[INFO]: Shader RectangleShader linked successfully!
Insufficient atlas size!
[INFO]: Shader BlurShader_VertexShader compiled successfully!
[INFO]: Shader BlurShader_FragmentShader compiled successfully!
[INFO]: Shader BlurShader linked successfully!
[INFO]: Shader SsaoShader_VertexShader compiled successfully!
[INFO]: Shader SsaoShader_FragmentShader compiled successfully!
[INFO]: Shader SsaoShader linked successfully!
[INFO]: A new associated scene rendering data was created for scene 0:1!
[INFO]: Shader DecalShader_VertexShader compiled successfully!
[INFO]: Shader DecalShader_FragmentShader compiled successfully!
[INFO]: Shader DecalShader linked successfully!
[INFO]: Shader AdaptationShader_VertexShader compiled successfully!
[INFO]: Shader AdaptationShader_FragmentShader compiled successfully!
[INFO]: Shader AdaptationShader linked successfully!
[INFO]: Shader LuminanceShader_VertexShader compiled successfully!
[INFO]: Shader LuminanceShader_FragmentShader compiled successfully!
[INFO]: Shader LuminanceShader linked successfully!
[INFO]: Shader DownscaleShader_VertexShader compiled successfully!
[INFO]: Shader DownscaleShader_FragmentShader compiled successfully!
[INFO]: Shader DownscaleShader linked successfully!
[INFO]: Shader HdrToLdrShader_VertexShader compiled successfully!
[INFO]: Shader HdrToLdrShader_FragmentShader compiled successfully!
[INFO]: Shader HdrToLdrShader linked successfully!
[INFO]: Shader BloomShader_VertexShader compiled successfully!
[INFO]: Shader BloomShader_FragmentShader compiled successfully!
[INFO]: Shader BloomShader linked successfully!
[INFO]: Shader GaussianBlurShader_VertexShader compiled successfully!
[INFO]: Shader GaussianBlurShader_FragmentShader compiled successfully!
[INFO]: Shader GaussianBlurShader linked successfully!

Unable to load level, panics at Some(Visit(RegionDoesNotExist("NormalTexture")))

Hello. I was following the tutorial here https://rg3d.rs/tutorials/2021/03/05/tutorial1.html but when I try to load the scene, I get this error. Here is the complete log.

The system is:

  • Linux 5.14.2-arch1-2 x86_64 GNU/Linux
  • Arch Linux x86_64

Update: it works with your scene (if I do a git clone of this repo) but not with scenes made by me on the editor compiled on my own system.

Update 2: the problem seems to be the editor or some configuration of it. When I open your scenes and save them on my version of the editor, I get the same error. Btw, the textures do not load. I guess it is related to the fact that the textures folder is not asked for.

It may be useful (or maybe not, but just in case) to point out that the editor asks for my working directory (which I defined as the src of my project) but not the textures folder as shown on the tutorial.

Thanks in advance.

[INFO]: Shader FlatShader_VertexShader compiled!

[INFO]: Shader FlatShader_FragmentShader compiled!

[INFO]: Shader FlatShader linked!

[INFO]: Shader SsaoShader_VertexShader compiled!

[INFO]: Shader SsaoShader_FragmentShader compiled!

[INFO]: Shader SsaoShader linked!

[INFO]: Shader DeferredLightShader_VertexShader compiled!

[INFO]: Shader DeferredLightShader_FragmentShader compiled!

[INFO]: Shader DeferredLightShader linked!

[INFO]: Shader DeferredLightShader_VertexShader compiled!

[INFO]: Shader DeferredLightShader_FragmentShader compiled!

[INFO]: Shader DeferredLightShader linked!

[INFO]: Shader DeferredLightShader_VertexShader compiled!

[INFO]: Shader DeferredLightShader_FragmentShader compiled!

[INFO]: Shader DeferredLightShader linked!

[INFO]: Shader AmbientLightShader_VertexShader compiled!

[INFO]: Shader AmbientLightShader_FragmentShader compiled!

[INFO]: Shader AmbientLightShader linked!

[INFO]: Shader FlatShader_VertexShader compiled!

[INFO]: Shader FlatShader_FragmentShader compiled!

[INFO]: Shader FlatShader linked!

[INFO]: Shader SpotShadowMapShader_VertexShader compiled!

[INFO]: Shader SpotShadowMapShader_FragmentShader compiled!

[INFO]: Shader SpotShadowMapShader linked!

[INFO]: Shader PointShadowMapShader_VertexShader compiled!

[INFO]: Shader PointShadowMapShader_FragmentShader compiled!

[INFO]: Shader PointShadowMapShader linked!

[INFO]: Shader SpotVolumetricLight_VertexShader compiled!

[INFO]: Shader SpotVolumetricLight_FragmentShader compiled!

[INFO]: Shader SpotVolumetricLight linked!

[INFO]: Shader PointVolumetricLight_VertexShader compiled!

[INFO]: Shader PointVolumetricLight_FragmentShader compiled!

[INFO]: Shader PointVolumetricLight linked!

[INFO]: Shader FlatShader_VertexShader compiled!

[INFO]: Shader FlatShader_FragmentShader compiled!

[INFO]: Shader FlatShader linked!

[INFO]: Shader FlatShader_VertexShader compiled!

[INFO]: Shader FlatShader_FragmentShader compiled!

[INFO]: Shader FlatShader linked!

[INFO]: Shader FlatShader_VertexShader compiled!

[INFO]: Shader FlatShader_FragmentShader compiled!

[INFO]: Shader FlatShader linked!

[INFO]: Shader UIShader_VertexShader compiled!

[INFO]: Shader UIShader_FragmentShader compiled!

[INFO]: Shader UIShader linked!

[INFO]: Shader ParticleSystemShader_VertexShader compiled!

[INFO]: Shader ParticleSystemShader_FragmentShader compiled!

[INFO]: Shader ParticleSystemShader linked!

[INFO]: Shader DebugShader_VertexShader compiled!

[INFO]: Shader DebugShader_FragmentShader compiled!

[INFO]: Shader DebugShader linked!

[INFO]: Shader ForwardShader_VertexShader compiled!

[INFO]: Shader ForwardShader_FragmentShader compiled!

[INFO]: Shader ForwardShader linked!

[INFO]: Shader FXAAShader_VertexShader compiled!

[INFO]: Shader FXAAShader_FragmentShader compiled!

[INFO]: Shader FXAAShader linked!

[INFO]: Shader SpriteShader2D_VertexShader compiled!

[INFO]: Shader SpriteShader2D_FragmentShader compiled!

[INFO]: Shader SpriteShader2D linked!

[ERROR]: Unable to load model from "data/models/scene.rgs"! Reason Visit(RegionDoesNotExist("NormalTexture"))

Canvas and Text

I don't see a way to create a canvas and/or text (or other UI elements) within the FyroxEd. They also don't appear to be created via code using the snippets in the documentation. Are they currently implemented and expected to be working? If so, could you please provide a full example of it working?

Edit: Here is my code. The UI pieces are in the score script. https://github.com/RoryLetteney/crab-clicker/tree/main/game/src

Edit2: Looks like text may only show up when inside something like a border or button?

Unable to load model from "data/levels/level.rgs"

After fixing build error in #3, I noticed when running the rpg tutorial, this runtime error:

[ERROR]: Unable to load model from "data/levels/level.rgs"! Reason Visit(FieldDoesNotExist("Id"))
thread 'main' panicked at 'called Result::unwrap() on an Err value: Some(Visit(FieldDoesNotExist("Id")))', src\level
\mod.rs:19:14

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.