<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ubc.ca/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=HannesSoderstrom</id>
	<title>UBC Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ubc.ca/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=HannesSoderstrom"/>
	<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/Special:Contributions/HannesSoderstrom"/>
	<updated>2026-09-14T04:21:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903682</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903682"/>
		<updated>2026-08-24T23:43:55Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: /* Principal Investigators (PI): */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&#039;&#039;&#039;Atomic Bonding Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&#039;&#039;&#039;Unit Cell (Crystal) Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lattice Defects Module:&#039;&#039;&#039;[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tensile Testing (Lab) Module:&#039;&#039;&#039;[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Graph Analysis Module:&#039;&#039;&#039;[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at docs/modules.md, as well as on this wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* [https://react.dev/reference/react React docs]&lt;br /&gt;
* [https://threejs.org/docs/ Three.js docs]&lt;br /&gt;
* [https://r3f.docs.pmnd.rs/getting-started/introduction R3F docs]&lt;br /&gt;
* [https://drei.docs.pmnd.rs/getting-started/introduction  Drei docs]&lt;br /&gt;
* [https://discoverthreejs.com/tips-and-tricks/Three.js tips]&lt;br /&gt;
* [https://jotai.org/docs Jotai docs]&lt;br /&gt;
* [https://github.com/developit/mitt/blob/main/README.md Mitt docs]&lt;br /&gt;
* [https://docs.github.com/en/pages GitHub Pages docs]&lt;br /&gt;
&lt;br /&gt;
== Designers Guide ==&lt;br /&gt;
&lt;br /&gt;
=== General Workflow ===&lt;br /&gt;
&lt;br /&gt;
The following design tools were used in the design and development of the project:&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender 5.1]&lt;br /&gt;
* [https://www.figma.com/ Figma]&lt;br /&gt;
* [https://inkscape.org/ Inkscape]&lt;br /&gt;
&lt;br /&gt;
=== Design Files ===&lt;br /&gt;
Relevant design files can be found at:&lt;br /&gt;
* [https://www.figma.com/files/team/1023299720193298363/project/600092140?fuid=1633258275408788061 ATOMIC FIGMA PAGE] - Contains all atomic design work created on figma (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
* [https://www.figma.com/design/lC4zrdgLiHVX255XlKTFQz/MOCK-UI---FINALS---All-Modules---WIP?node-id=60-1142&amp;amp;t=gqAzlBKDI4ZwI2tt-1 MAIN FIGMA DESIGN FILE] - References all current designs and concepts (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;26_design_files&#039;&#039;&#039; folder on GitHub. This includes Blender Files (Contain the bulk of UI development work, containing all the 2D mockups for the overall UI and some visual tests) and Videos + Images (Rendered or exported visuals used as demos or as content within a UI design)&lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Active&#039;&#039;&#039; - Files currently used in design development or containing files that are references/models of the ones used in the current build. &lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Inactive&#039;&#039;&#039; - Files that were used and iterated upon in the design process and have been kept for documentation purposes. &lt;br /&gt;
&lt;br /&gt;
=== Design Framework and Methodology ===&lt;br /&gt;
&lt;br /&gt;
The IMLE was designed referencing existing scientific tools and visualizations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Reference Work&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|William D. Callister, “Materials Science and Engineering”, Wiley, 10th edition&lt;br /&gt;
|Textbook for APSC 278/279 containing various visuals of scientific concepts&lt;br /&gt;
|-&lt;br /&gt;
|[https://javalab.org/en/chemical_bonding_en/ Chemical Bonding Simulation]&lt;br /&gt;
|Simple atomic bonding sandbox simulation&lt;br /&gt;
|-&lt;br /&gt;
|[https://atomic-lab.net/atomic-lab-3d AtomicLab Sandbox]&lt;br /&gt;
|Individual atom builder and analysis toolkit&lt;br /&gt;
|-&lt;br /&gt;
|[https://jeremyberchtold.com/UnitCellVisualizer/ Unit Cell Visualizer]&lt;br /&gt;
|Simple interactive unit cell visualizer&lt;br /&gt;
|-&lt;br /&gt;
|[https://materialsforengineering.com/crystallographicvisualizer Crystallographic Visualizer]&lt;br /&gt;
|Visualizer for crystallographic planes and directions&lt;br /&gt;
|-&lt;br /&gt;
|[https://flashyscience.com/experiments/open/tensile-lite Flash Tensile Test]&lt;br /&gt;
|Flashy Science virtual tensile testing experience&lt;br /&gt;
|-&lt;br /&gt;
|[https://mechsimulator.com/tools/utm-testing/ UTM Virtual Lab]&lt;br /&gt;
|Analysis oriented tensile testing and graphing tool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IMLE was also designed with consideration of UDL guidelines, key guidelines that influence&lt;br /&gt;
design work for the project include:&lt;br /&gt;
&lt;br /&gt;
*Support opportunities to customize the display of information (1.1) &lt;br /&gt;
*Support multiple ways to perceive information (1.2) &lt;br /&gt;
*Clarify Vocabulary, symbols, and language structures (2.1) &lt;br /&gt;
*Support decoding of text, mathematical notation, and symbols (2.2) &lt;br /&gt;
*Connect prior knowledge to new learning (3.1) &lt;br /&gt;
*Cultivate multiple ways of knowing and making meaning (3.3) &lt;br /&gt;
*Maximize transfer and generalization (3.4) &lt;br /&gt;
*Optimize choice and autonomy (7.1) &lt;br /&gt;
*Nurture joy and play (7.3)&lt;br /&gt;
&lt;br /&gt;
=== Persistent design elements ===&lt;br /&gt;
*Help tooltip&lt;br /&gt;
*LM/DM button&lt;br /&gt;
*Header module selection&lt;br /&gt;
*General UI layout and organization&lt;br /&gt;
*Asset style and aesthetic&lt;br /&gt;
*Colour consistency&lt;br /&gt;
**Blue Tone - Interactive tools/features&lt;br /&gt;
**Red Tone - Navigation elements&lt;br /&gt;
**Yellow Tone - Help or tutorial elements&lt;br /&gt;
&lt;br /&gt;
A light/dark mode toggle has been designed into the project but has not been implemented yet. A dedicated high contrast mode could also be added in future&lt;br /&gt;
&lt;br /&gt;
=== Design Process ===&lt;br /&gt;
In the creation and development of the designs:&lt;br /&gt;
#Top layer 2D UI design was completed in Figma&lt;br /&gt;
#3D mock ups of interactive content were made in Blender and rendered for use in UI mock-ups&lt;br /&gt;
#2D UI and rendered 3D content were layered in Figma&lt;br /&gt;
&lt;br /&gt;
=== 3D assets ===&lt;br /&gt;
The project uses a toon, cel shaded aesthetic shown in the attached files and reference designs. Textures were created in Blender/EEVEE, before being reformatted for cycles and baked for exporting. This method does not allow for the shaders to react to lighting within the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
[[File:UBC IMLE Poster.jpg|alt=UBC IMLE Poster|center|thumb|800x800px|&#039;&#039;&#039;UBC IMLE Poster&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
== Project Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Johannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903601</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903601"/>
		<updated>2026-08-21T22:54:03Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: /* Design Framework and Methodology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&#039;&#039;&#039;Atomic Bonding Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&#039;&#039;&#039;Unit Cell (Crystal) Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lattice Defects Module:&#039;&#039;&#039;[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tensile Testing (Lab) Module:&#039;&#039;&#039;[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Graph Analysis Module:&#039;&#039;&#039;[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at docs/modules.md, as well as on this wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* [https://react.dev/reference/react React docs]&lt;br /&gt;
* [https://threejs.org/docs/ Three.js docs]&lt;br /&gt;
* [https://r3f.docs.pmnd.rs/getting-started/introduction R3F docs]&lt;br /&gt;
* [https://drei.docs.pmnd.rs/getting-started/introduction  Drei docs]&lt;br /&gt;
* [https://discoverthreejs.com/tips-and-tricks/Three.js tips]&lt;br /&gt;
* [https://jotai.org/docs Jotai docs]&lt;br /&gt;
* [https://github.com/developit/mitt/blob/main/README.md Mitt docs]&lt;br /&gt;
* [https://docs.github.com/en/pages GitHub Pages docs]&lt;br /&gt;
&lt;br /&gt;
== Designers Guide ==&lt;br /&gt;
&lt;br /&gt;
=== General Workflow ===&lt;br /&gt;
&lt;br /&gt;
The following design tools were used in the design and development of the project:&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender 5.1]&lt;br /&gt;
* [https://www.figma.com/ Figma]&lt;br /&gt;
* [https://inkscape.org/ Inkscape]&lt;br /&gt;
&lt;br /&gt;
=== Design Files ===&lt;br /&gt;
Relevant design files can be found at:&lt;br /&gt;
* [https://www.figma.com/files/team/1023299720193298363/project/600092140?fuid=1633258275408788061 ATOMIC FIGMA PAGE] - Contains all atomic design work created on figma (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
* [https://www.figma.com/design/lC4zrdgLiHVX255XlKTFQz/MOCK-UI---FINALS---All-Modules---WIP?node-id=60-1142&amp;amp;t=gqAzlBKDI4ZwI2tt-1 MAIN FIGMA DESIGN FILE] - References all current designs and concepts (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;26_design_files&#039;&#039;&#039; folder on GitHub. This includes Blender Files (Contain the bulk of UI development work, containing all the 2D mockups for the overall UI and some visual tests) and Videos + Images (Rendered or exported visuals used as demos or as content within a UI design)&lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Active&#039;&#039;&#039; - Files currently used in design development or containing files that are references/models of the ones used in the current build. &lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Inactive&#039;&#039;&#039; - Files that were used and iterated upon in the design process and have been kept for documentation purposes. &lt;br /&gt;
&lt;br /&gt;
=== Design Framework and Methodology ===&lt;br /&gt;
&lt;br /&gt;
The IMLE was designed referencing existing scientific tools and visualizations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Reference Work&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|William D. Callister, “Materials Science and Engineering”, Wiley, 10th edition&lt;br /&gt;
|Textbook for APSC 278/279 containing various visuals of scientific concepts&lt;br /&gt;
|-&lt;br /&gt;
|[https://javalab.org/en/chemical_bonding_en/ Chemical Bonding Simulation]&lt;br /&gt;
|Simple atomic bonding sandbox simulation&lt;br /&gt;
|-&lt;br /&gt;
|[https://atomic-lab.net/atomic-lab-3d AtomicLab Sandbox]&lt;br /&gt;
|Individual atom builder and analysis toolkit&lt;br /&gt;
|-&lt;br /&gt;
|[https://jeremyberchtold.com/UnitCellVisualizer/ Unit Cell Visualizer]&lt;br /&gt;
|Simple interactive unit cell visualizer&lt;br /&gt;
|-&lt;br /&gt;
|[https://materialsforengineering.com/crystallographicvisualizer Crystallographic Visualizer]&lt;br /&gt;
|Visualizer for crystallographic planes and directions&lt;br /&gt;
|-&lt;br /&gt;
|[https://flashyscience.com/experiments/open/tensile-lite Flash Tensile Test]&lt;br /&gt;
|Flashy Science virtual tensile testing experience&lt;br /&gt;
|-&lt;br /&gt;
|[https://mechsimulator.com/tools/utm-testing/ UTM Virtual Lab]&lt;br /&gt;
|Analysis oriented tensile testing and graphing tool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IMLE was also designed with consideration of UDL guidelines, key guidelines that influence&lt;br /&gt;
design work for the project include:&lt;br /&gt;
&lt;br /&gt;
*Support opportunities to customize the display of information (1.1) &lt;br /&gt;
*Support multiple ways to perceive information (1.2) &lt;br /&gt;
*Clarify Vocabulary, symbols, and language structures (2.1) &lt;br /&gt;
*Support decoding of text, mathematical notation, and symbols (2.2) &lt;br /&gt;
*Connect prior knowledge to new learning (3.1) &lt;br /&gt;
*Cultivate multiple ways of knowing and making meaning (3.3) &lt;br /&gt;
*Maximize transfer and generalization (3.4) &lt;br /&gt;
*Optimize choice and autonomy (7.1) &lt;br /&gt;
*Nurture joy and play (7.3)&lt;br /&gt;
&lt;br /&gt;
=== Persistent design elements ===&lt;br /&gt;
*Help tooltip&lt;br /&gt;
*LM/DM button&lt;br /&gt;
*Header module selection&lt;br /&gt;
*General UI layout and organization&lt;br /&gt;
*Asset style and aesthetic&lt;br /&gt;
*Colour consistency&lt;br /&gt;
**Blue Tone - Interactive tools/features&lt;br /&gt;
**Red Tone - Navigation elements&lt;br /&gt;
**Yellow Tone - Help or tutorial elements&lt;br /&gt;
&lt;br /&gt;
A light/dark mode toggle has been designed into the project but has not been implemented yet. A dedicated high contrast mode could also be added in future&lt;br /&gt;
&lt;br /&gt;
=== Design Process ===&lt;br /&gt;
In the creation and development of the designs:&lt;br /&gt;
#Top layer 2D UI design was completed in Figma&lt;br /&gt;
#3D mock ups of interactive content were made in Blender and rendered for use in UI mock-ups&lt;br /&gt;
#2D UI and rendered 3D content were layered in Figma&lt;br /&gt;
&lt;br /&gt;
=== 3D assets ===&lt;br /&gt;
The project uses a toon, cel shaded aesthetic shown in the attached files and reference designs. Textures were created in Blender/EEVEE, before being reformatted for cycles and baked for exporting. This method does not allow for the shaders to react to lighting within the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
[[File:UBC IMLE Poster.jpg|alt=UBC IMLE Poster|center|thumb|800x800px|&#039;&#039;&#039;UBC IMLE Poster&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
== Project Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903600</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903600"/>
		<updated>2026-08-21T22:52:20Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&#039;&#039;&#039;Atomic Bonding Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&#039;&#039;&#039;Unit Cell (Crystal) Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lattice Defects Module:&#039;&#039;&#039;[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tensile Testing (Lab) Module:&#039;&#039;&#039;[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Graph Analysis Module:&#039;&#039;&#039;[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at docs/modules.md, as well as on this wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* [https://react.dev/reference/react React docs]&lt;br /&gt;
* [https://threejs.org/docs/ Three.js docs]&lt;br /&gt;
* [https://r3f.docs.pmnd.rs/getting-started/introduction R3F docs]&lt;br /&gt;
* [https://drei.docs.pmnd.rs/getting-started/introduction  Drei docs]&lt;br /&gt;
* [https://discoverthreejs.com/tips-and-tricks/Three.js tips]&lt;br /&gt;
* [https://jotai.org/docs Jotai docs]&lt;br /&gt;
* [https://github.com/developit/mitt/blob/main/README.md Mitt docs]&lt;br /&gt;
* [https://docs.github.com/en/pages GitHub Pages docs]&lt;br /&gt;
&lt;br /&gt;
== Designers Guide ==&lt;br /&gt;
&lt;br /&gt;
=== General Workflow ===&lt;br /&gt;
&lt;br /&gt;
The following design tools were used in the design and development of the project:&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender 5.1]&lt;br /&gt;
* [https://www.figma.com/ Figma]&lt;br /&gt;
* [https://inkscape.org/ Inkscape]&lt;br /&gt;
&lt;br /&gt;
=== Design Files ===&lt;br /&gt;
Relevant design files can be found at:&lt;br /&gt;
* [https://www.figma.com/files/team/1023299720193298363/project/600092140?fuid=1633258275408788061 ATOMIC FIGMA PAGE] - Contains all atomic design work created on figma (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
* [https://www.figma.com/design/lC4zrdgLiHVX255XlKTFQz/MOCK-UI---FINALS---All-Modules---WIP?node-id=60-1142&amp;amp;t=gqAzlBKDI4ZwI2tt-1 MAIN FIGMA DESIGN FILE] - References all current designs and concepts (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;26_design_files&#039;&#039;&#039; folder on GitHub. This includes Blender Files (Contain the bulk of UI development work, containing all the 2D mockups for the overall UI and some visual tests) and Videos + Images (Rendered or exported visuals used as demos or as content within a UI design)&lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Active&#039;&#039;&#039; - Files currently used in design development or containing files that are references/models of the ones used in the current build. &lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Inactive&#039;&#039;&#039; - Files that were used and iterated upon in the design process and have been kept for documentation purposes. &lt;br /&gt;
&lt;br /&gt;
=== Design Framework and Methodology ===&lt;br /&gt;
&lt;br /&gt;
The IMLE was designed referencing existing scientific tools and visualizations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Reference Work&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|William D. Callister, “Materials Science and Engineering”, Wiley, 10th edition&lt;br /&gt;
|Textbook for APSC 278/279 containing various visuals of scientific concepts&lt;br /&gt;
|-&lt;br /&gt;
|Chemical Bonding Simulation&lt;br /&gt;
|Simple atomic bonding sandbox simulation&lt;br /&gt;
|-&lt;br /&gt;
|AtomicLab Sandbox&lt;br /&gt;
|Individual atom builder and analysis toolkit&lt;br /&gt;
|-&lt;br /&gt;
|Unit Cell Visualizer&lt;br /&gt;
|Simple interactive unit cell visualizer&lt;br /&gt;
|-&lt;br /&gt;
|Crystallographic Visualizer&lt;br /&gt;
|Visualizer for crystallographic planes and directions&lt;br /&gt;
|-&lt;br /&gt;
|Flash Tensile Test&lt;br /&gt;
|Flashy Science virtual tensile testing experience&lt;br /&gt;
|-&lt;br /&gt;
|UTM Virtual Lab&lt;br /&gt;
|Analysis oriented tensile testing and graphing tool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IMLE was also designed with consideration of UDL guidelines, key guidelines that influence&lt;br /&gt;
design work for the project include:&lt;br /&gt;
&lt;br /&gt;
*Support opportunities to customize the display of information (1.1) &lt;br /&gt;
*Support multiple ways to perceive information (1.2) &lt;br /&gt;
*Clarify Vocabulary, symbols, and language structures (2.1) &lt;br /&gt;
*Support decoding of text, mathematical notation, and symbols (2.2) &lt;br /&gt;
*Connect prior knowledge to new learning (3.1) &lt;br /&gt;
*Cultivate multiple ways of knowing and making meaning (3.3) &lt;br /&gt;
*Maximize transfer and generalization (3.4) &lt;br /&gt;
*Optimize choice and autonomy (7.1) &lt;br /&gt;
*Nurture joy and play (7.3)&lt;br /&gt;
&lt;br /&gt;
=== Persistent design elements ===&lt;br /&gt;
*Help tooltip&lt;br /&gt;
*LM/DM button&lt;br /&gt;
*Header module selection&lt;br /&gt;
*General UI layout and organization&lt;br /&gt;
*Asset style and aesthetic&lt;br /&gt;
*Colour consistency&lt;br /&gt;
**Blue Tone - Interactive tools/features&lt;br /&gt;
**Red Tone - Navigation elements&lt;br /&gt;
**Yellow Tone - Help or tutorial elements&lt;br /&gt;
&lt;br /&gt;
A light/dark mode toggle has been designed into the project but has not been implemented yet. A dedicated high contrast mode could also be added in future&lt;br /&gt;
&lt;br /&gt;
=== Design Process ===&lt;br /&gt;
In the creation and development of the designs:&lt;br /&gt;
#Top layer 2D UI design was completed in Figma&lt;br /&gt;
#3D mock ups of interactive content were made in Blender and rendered for use in UI mock-ups&lt;br /&gt;
#2D UI and rendered 3D content were layered in Figma&lt;br /&gt;
&lt;br /&gt;
=== 3D assets ===&lt;br /&gt;
The project uses a toon, cel shaded aesthetic shown in the attached files and reference designs. Textures were created in Blender/EEVEE, before being reformatted for cycles and baked for exporting. This method does not allow for the shaders to react to lighting within the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
[[File:UBC IMLE Poster.jpg|alt=UBC IMLE Poster|center|thumb|800x800px|&#039;&#039;&#039;UBC IMLE Poster&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
== Project Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903599</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903599"/>
		<updated>2026-08-21T22:50:30Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: /* Persistent design elements include: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&#039;&#039;&#039;Atomic Bonding Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&#039;&#039;&#039;Unit Cell (Crystal) Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lattice Defects Module:&#039;&#039;&#039;[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tensile Testing (Lab) Module:&#039;&#039;&#039;[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Graph Analysis Module:&#039;&#039;&#039;[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at docs/modules.md, as well as on this wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* [https://react.dev/reference/react React docs]&lt;br /&gt;
* [https://threejs.org/docs/ Three.js docs]&lt;br /&gt;
* [https://r3f.docs.pmnd.rs/getting-started/introduction R3F docs]&lt;br /&gt;
* [https://drei.docs.pmnd.rs/getting-started/introduction  Drei docs]&lt;br /&gt;
* [https://discoverthreejs.com/tips-and-tricks/Three.js tips]&lt;br /&gt;
* [https://jotai.org/docs Jotai docs]&lt;br /&gt;
* [https://github.com/developit/mitt/blob/main/README.md Mitt docs]&lt;br /&gt;
* [https://docs.github.com/en/pages GitHub Pages docs]&lt;br /&gt;
&lt;br /&gt;
== Designers Guide ==&lt;br /&gt;
&lt;br /&gt;
=== General Workflow ===&lt;br /&gt;
&lt;br /&gt;
The following design tools were used in the design and development of the project:&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender 5.1]&lt;br /&gt;
* [https://www.figma.com/ Figma]&lt;br /&gt;
* [https://inkscape.org/ Inkscape]&lt;br /&gt;
&lt;br /&gt;
=== Design Files ===&lt;br /&gt;
Relevant design files can be found at:&lt;br /&gt;
* [https://www.figma.com/files/team/1023299720193298363/project/600092140?fuid=1633258275408788061 ATOMIC FIGMA PAGE] - Contains all atomic design work created on figma (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
* [https://www.figma.com/design/lC4zrdgLiHVX255XlKTFQz/MOCK-UI---FINALS---All-Modules---WIP?node-id=60-1142&amp;amp;t=gqAzlBKDI4ZwI2tt-1 MAIN FIGMA DESIGN FILE] - References all current designs and concepts (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;26_design_files&#039;&#039;&#039; folder on GitHub. This includes Blender Files (Contain the bulk of UI development work, containing all the 2D mockups for the overall UI and some visual tests) and Videos + Images (Rendered or exported visuals used as demos or as content within a UI design)&lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Active&#039;&#039;&#039; - Files currently used in design development or containing files that are references/models of the ones used in the current build. &lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Inactive&#039;&#039;&#039; - Files that were used and iterated upon in the design process and have been kept for documentation purposes. &lt;br /&gt;
&lt;br /&gt;
=== Design Framework and Methodology ===&lt;br /&gt;
&lt;br /&gt;
The IMLE was designed referencing existing scientific tools and visualizations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Reference Work&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|William D. Callister, “Materials Science and Engineering”, Wiley, 10th edition&lt;br /&gt;
|Textbook for APSC 278/279 containing various visuals of scientific concepts&lt;br /&gt;
|-&lt;br /&gt;
|Chemical Bonding Simulation&lt;br /&gt;
|Simple atomic bonding sandbox simulation&lt;br /&gt;
|-&lt;br /&gt;
|AtomicLab Sandbox&lt;br /&gt;
|Individual atom builder and analysis toolkit&lt;br /&gt;
|-&lt;br /&gt;
|Unit Cell Visualizer&lt;br /&gt;
|Simple interactive unit cell visualizer&lt;br /&gt;
|-&lt;br /&gt;
|Crystallographic Visualizer&lt;br /&gt;
|Visualizer for crystallographic planes and directions&lt;br /&gt;
|-&lt;br /&gt;
|Flash Tensile Test&lt;br /&gt;
|Flashy Science virtual tensile testing experience&lt;br /&gt;
|-&lt;br /&gt;
|UTM Virtual Lab&lt;br /&gt;
|Analysis oriented tensile testing and graphing tool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IMLE was also designed with consideration of UDL guidelines, key guidelines that influence&lt;br /&gt;
design work for the project include:&lt;br /&gt;
&lt;br /&gt;
*Support opportunities to customize the display of information (1.1) &lt;br /&gt;
*Support multiple ways to perceive information (1.2) &lt;br /&gt;
*Clarify Vocabulary, symbols, and language structures (2.1) &lt;br /&gt;
*Support decoding of text, mathematical notation, and symbols (2.2) &lt;br /&gt;
*Connect prior knowledge to new learning (3.1) &lt;br /&gt;
*Cultivate multiple ways of knowing and making meaning (3.3) &lt;br /&gt;
*Maximize transfer and generalization (3.4) &lt;br /&gt;
*Optimize choice and autonomy (7.1) &lt;br /&gt;
*Nurture joy and play (7.3)&lt;br /&gt;
&lt;br /&gt;
=== Persistent design elements ===&lt;br /&gt;
*Help tooltip&lt;br /&gt;
*LM/DM button&lt;br /&gt;
*Header module selection&lt;br /&gt;
*General UI layout and organization&lt;br /&gt;
*Asset style and aesthetic&lt;br /&gt;
*Colour consistency&lt;br /&gt;
**Blue Tone - Interactive tools/features&lt;br /&gt;
**Red Tone - Navigation elements&lt;br /&gt;
**Yellow Tone - Help or tutorial elements&lt;br /&gt;
&lt;br /&gt;
A light/dark mode toggle has been designed into the project but has not been implemented yet. A dedicated high contrast mode could also be added in future&lt;br /&gt;
&lt;br /&gt;
=== Design Process ===&lt;br /&gt;
In the creation and development of the designs:&lt;br /&gt;
#Top layer 2D UI design was completed in Figma&lt;br /&gt;
#3D mock ups of interactive content were made in Blender and rendered for use in UI mock-ups&lt;br /&gt;
#2D UI and rendered 3D content were layered in Figma&lt;br /&gt;
&lt;br /&gt;
=== 3D assets ===&lt;br /&gt;
The project uses a toon, cel shaded aesthetic shown in the attached files and reference designs. Textures were created in Blender/EEVEE, before being reformatted for cycles and baked for exporting. This method does not allow for the shaders to react to lighting within the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
[[File:UBC IMLE Poster.jpg|alt=UBC IMLE Poster|center|thumb|800x800px|&#039;&#039;&#039;UBC IMLE Poster&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903598</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903598"/>
		<updated>2026-08-21T22:50:03Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&#039;&#039;&#039;Atomic Bonding Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&#039;&#039;&#039;Unit Cell (Crystal) Module:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lattice Defects Module:&#039;&#039;&#039;[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tensile Testing (Lab) Module:&#039;&#039;&#039;[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Graph Analysis Module:&#039;&#039;&#039;[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at docs/modules.md, as well as on this wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* [https://react.dev/reference/react React docs]&lt;br /&gt;
* [https://threejs.org/docs/ Three.js docs]&lt;br /&gt;
* [https://r3f.docs.pmnd.rs/getting-started/introduction R3F docs]&lt;br /&gt;
* [https://drei.docs.pmnd.rs/getting-started/introduction  Drei docs]&lt;br /&gt;
* [https://discoverthreejs.com/tips-and-tricks/Three.js tips]&lt;br /&gt;
* [https://jotai.org/docs Jotai docs]&lt;br /&gt;
* [https://github.com/developit/mitt/blob/main/README.md Mitt docs]&lt;br /&gt;
* [https://docs.github.com/en/pages GitHub Pages docs]&lt;br /&gt;
&lt;br /&gt;
== Designers Guide ==&lt;br /&gt;
&lt;br /&gt;
=== General Workflow ===&lt;br /&gt;
&lt;br /&gt;
The following design tools were used in the design and development of the project:&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender 5.1]&lt;br /&gt;
* [https://www.figma.com/ Figma]&lt;br /&gt;
* [https://inkscape.org/ Inkscape]&lt;br /&gt;
&lt;br /&gt;
=== Design Files ===&lt;br /&gt;
Relevant design files can be found at:&lt;br /&gt;
* [https://www.figma.com/files/team/1023299720193298363/project/600092140?fuid=1633258275408788061 ATOMIC FIGMA PAGE] - Contains all atomic design work created on figma (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
* [https://www.figma.com/design/lC4zrdgLiHVX255XlKTFQz/MOCK-UI---FINALS---All-Modules---WIP?node-id=60-1142&amp;amp;t=gqAzlBKDI4ZwI2tt-1 MAIN FIGMA DESIGN FILE] - References all current designs and concepts (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;26_design_files&#039;&#039;&#039; folder on GitHub. This includes Blender Files (Contain the bulk of UI development work, containing all the 2D mockups for the overall UI and some visual tests) and Videos + Images (Rendered or exported visuals used as demos or as content within a UI design)&lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Active&#039;&#039;&#039; - Files currently used in design development or containing files that are references/models of the ones used in the current build. &lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Inactive&#039;&#039;&#039; - Files that were used and iterated upon in the design process and have been kept for documentation purposes. &lt;br /&gt;
&lt;br /&gt;
=== Design Framework and Methodology ===&lt;br /&gt;
&lt;br /&gt;
The IMLE was designed referencing existing scientific tools and visualizations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Reference Work&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|William D. Callister, “Materials Science and Engineering”, Wiley, 10th edition&lt;br /&gt;
|Textbook for APSC 278/279 containing various visuals of scientific concepts&lt;br /&gt;
|-&lt;br /&gt;
|Chemical Bonding Simulation&lt;br /&gt;
|Simple atomic bonding sandbox simulation&lt;br /&gt;
|-&lt;br /&gt;
|AtomicLab Sandbox&lt;br /&gt;
|Individual atom builder and analysis toolkit&lt;br /&gt;
|-&lt;br /&gt;
|Unit Cell Visualizer&lt;br /&gt;
|Simple interactive unit cell visualizer&lt;br /&gt;
|-&lt;br /&gt;
|Crystallographic Visualizer&lt;br /&gt;
|Visualizer for crystallographic planes and directions&lt;br /&gt;
|-&lt;br /&gt;
|Flash Tensile Test&lt;br /&gt;
|Flashy Science virtual tensile testing experience&lt;br /&gt;
|-&lt;br /&gt;
|UTM Virtual Lab&lt;br /&gt;
|Analysis oriented tensile testing and graphing tool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IMLE was also designed with consideration of UDL guidelines, key guidelines that influence&lt;br /&gt;
design work for the project include:&lt;br /&gt;
&lt;br /&gt;
*Support opportunities to customize the display of information (1.1) &lt;br /&gt;
*Support multiple ways to perceive information (1.2) &lt;br /&gt;
*Clarify Vocabulary, symbols, and language structures (2.1) &lt;br /&gt;
*Support decoding of text, mathematical notation, and symbols (2.2) &lt;br /&gt;
*Connect prior knowledge to new learning (3.1) &lt;br /&gt;
*Cultivate multiple ways of knowing and making meaning (3.3) &lt;br /&gt;
*Maximize transfer and generalization (3.4) &lt;br /&gt;
*Optimize choice and autonomy (7.1) &lt;br /&gt;
*Nurture joy and play (7.3)&lt;br /&gt;
&lt;br /&gt;
==== Persistent design elements include: ====&lt;br /&gt;
&lt;br /&gt;
*Help tooltip&lt;br /&gt;
*LM/DM button&lt;br /&gt;
*Header module selection&lt;br /&gt;
*General UI layout and organization&lt;br /&gt;
*Asset style and aesthetic&lt;br /&gt;
*Colour consistency&lt;br /&gt;
**Blue Tone - Interactive tools/features&lt;br /&gt;
**Red Tone - Navigation elements&lt;br /&gt;
**Yellow Tone - Help or tutorial elements&lt;br /&gt;
&lt;br /&gt;
A light/dark mode toggle has been designed into the project but has not been implemented yet. A dedicated high contrast mode could also be added in future&lt;br /&gt;
&lt;br /&gt;
=== Design Process ===&lt;br /&gt;
In the creation and development of the designs:&lt;br /&gt;
#Top layer 2D UI design was completed in Figma&lt;br /&gt;
#3D mock ups of interactive content were made in Blender and rendered for use in UI mock-ups&lt;br /&gt;
#2D UI and rendered 3D content were layered in Figma&lt;br /&gt;
&lt;br /&gt;
=== 3D assets ===&lt;br /&gt;
The project uses a toon, cel shaded aesthetic shown in the attached files and reference designs. Textures were created in Blender/EEVEE, before being reformatted for cycles and baked for exporting. This method does not allow for the shaders to react to lighting within the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
[[File:UBC IMLE Poster.jpg|alt=UBC IMLE Poster|center|thumb|800x800px|&#039;&#039;&#039;UBC IMLE Poster&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903597</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903597"/>
		<updated>2026-08-21T22:49:45Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
===== Atomic Bonding Module: =====&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
===== Unit Cell (Crystal) Module: =====&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
===== Lattice Defects Module: =====&lt;br /&gt;
[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
===== Tensile Testing (Lab) Module: =====&lt;br /&gt;
[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
===== Graph Analysis Module: =====&lt;br /&gt;
[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at docs/modules.md, as well as on this wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* [https://react.dev/reference/react React docs]&lt;br /&gt;
* [https://threejs.org/docs/ Three.js docs]&lt;br /&gt;
* [https://r3f.docs.pmnd.rs/getting-started/introduction R3F docs]&lt;br /&gt;
* [https://drei.docs.pmnd.rs/getting-started/introduction  Drei docs]&lt;br /&gt;
* [https://discoverthreejs.com/tips-and-tricks/Three.js tips]&lt;br /&gt;
* [https://jotai.org/docs Jotai docs]&lt;br /&gt;
* [https://github.com/developit/mitt/blob/main/README.md Mitt docs]&lt;br /&gt;
* [https://docs.github.com/en/pages GitHub Pages docs]&lt;br /&gt;
&lt;br /&gt;
== Designers Guide ==&lt;br /&gt;
&lt;br /&gt;
=== General Workflow ===&lt;br /&gt;
&lt;br /&gt;
The following design tools were used in the design and development of the project:&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender 5.1]&lt;br /&gt;
* [https://www.figma.com/ Figma]&lt;br /&gt;
* [https://inkscape.org/ Inkscape]&lt;br /&gt;
&lt;br /&gt;
=== Design Files ===&lt;br /&gt;
Relevant design files can be found at:&lt;br /&gt;
* [https://www.figma.com/files/team/1023299720193298363/project/600092140?fuid=1633258275408788061 ATOMIC FIGMA PAGE] - Contains all atomic design work created on figma (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
* [https://www.figma.com/design/lC4zrdgLiHVX255XlKTFQz/MOCK-UI---FINALS---All-Modules---WIP?node-id=60-1142&amp;amp;t=gqAzlBKDI4ZwI2tt-1 MAIN FIGMA DESIGN FILE] - References all current designs and concepts (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;26_design_files&#039;&#039;&#039; folder on GitHub. This includes Blender Files (Contain the bulk of UI development work, containing all the 2D mockups for the overall UI and some visual tests) and Videos + Images (Rendered or exported visuals used as demos or as content within a UI design)&lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Active&#039;&#039;&#039; - Files currently used in design development or containing files that are references/models of the ones used in the current build. &lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Inactive&#039;&#039;&#039; - Files that were used and iterated upon in the design process and have been kept for documentation purposes. &lt;br /&gt;
&lt;br /&gt;
=== Design Framework and Methodology ===&lt;br /&gt;
&lt;br /&gt;
The IMLE was designed referencing existing scientific tools and visualizations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Reference Work&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|William D. Callister, “Materials Science and Engineering”, Wiley, 10th edition&lt;br /&gt;
|Textbook for APSC 278/279 containing various visuals of scientific concepts&lt;br /&gt;
|-&lt;br /&gt;
|Chemical Bonding Simulation&lt;br /&gt;
|Simple atomic bonding sandbox simulation&lt;br /&gt;
|-&lt;br /&gt;
|AtomicLab Sandbox&lt;br /&gt;
|Individual atom builder and analysis toolkit&lt;br /&gt;
|-&lt;br /&gt;
|Unit Cell Visualizer&lt;br /&gt;
|Simple interactive unit cell visualizer&lt;br /&gt;
|-&lt;br /&gt;
|Crystallographic Visualizer&lt;br /&gt;
|Visualizer for crystallographic planes and directions&lt;br /&gt;
|-&lt;br /&gt;
|Flash Tensile Test&lt;br /&gt;
|Flashy Science virtual tensile testing experience&lt;br /&gt;
|-&lt;br /&gt;
|UTM Virtual Lab&lt;br /&gt;
|Analysis oriented tensile testing and graphing tool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IMLE was also designed with consideration of UDL guidelines, key guidelines that influence&lt;br /&gt;
design work for the project include:&lt;br /&gt;
&lt;br /&gt;
*Support opportunities to customize the display of information (1.1) &lt;br /&gt;
*Support multiple ways to perceive information (1.2) &lt;br /&gt;
*Clarify Vocabulary, symbols, and language structures (2.1) &lt;br /&gt;
*Support decoding of text, mathematical notation, and symbols (2.2) &lt;br /&gt;
*Connect prior knowledge to new learning (3.1) &lt;br /&gt;
*Cultivate multiple ways of knowing and making meaning (3.3) &lt;br /&gt;
*Maximize transfer and generalization (3.4) &lt;br /&gt;
*Optimize choice and autonomy (7.1) &lt;br /&gt;
*Nurture joy and play (7.3)&lt;br /&gt;
&lt;br /&gt;
==== Persistent design elements include: ====&lt;br /&gt;
&lt;br /&gt;
*Help tooltip&lt;br /&gt;
*LM/DM button&lt;br /&gt;
*Header module selection&lt;br /&gt;
*General UI layout and organization&lt;br /&gt;
*Asset style and aesthetic&lt;br /&gt;
*Colour consistency&lt;br /&gt;
**Blue Tone - Interactive tools/features&lt;br /&gt;
**Red Tone - Navigation elements&lt;br /&gt;
**Yellow Tone - Help or tutorial elements&lt;br /&gt;
&lt;br /&gt;
A light/dark mode toggle has been designed into the project but has not been implemented yet. A dedicated high contrast mode could also be added in future&lt;br /&gt;
&lt;br /&gt;
=== Design Process ===&lt;br /&gt;
In the creation and development of the designs:&lt;br /&gt;
#Top layer 2D UI design was completed in Figma&lt;br /&gt;
#3D mock ups of interactive content were made in Blender and rendered for use in UI mock-ups&lt;br /&gt;
#2D UI and rendered 3D content were layered in Figma&lt;br /&gt;
&lt;br /&gt;
=== 3D assets ===&lt;br /&gt;
The project uses a toon, cel shaded aesthetic shown in the attached files and reference designs. Textures were created in Blender/EEVEE, before being reformatted for cycles and baked for exporting. This method does not allow for the shaders to react to lighting within the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
[[File:UBC IMLE Poster.jpg|alt=UBC IMLE Poster|center|thumb|800x800px|&#039;&#039;&#039;UBC IMLE Poster&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903596</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903596"/>
		<updated>2026-08-21T22:48:53Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Atomic Bonding Module: ===&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Unit Cell (Crystal) Module: ===&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
=== Lattice Defects Module: ===&lt;br /&gt;
[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
=== Tensile Testing (Lab) Module: ===&lt;br /&gt;
[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
=== Graph Analysis Module: ===&lt;br /&gt;
[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at docs/modules.md, as well as on this wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* [https://react.dev/reference/react React docs]&lt;br /&gt;
* [https://threejs.org/docs/ Three.js docs]&lt;br /&gt;
* [https://r3f.docs.pmnd.rs/getting-started/introduction R3F docs]&lt;br /&gt;
* [https://drei.docs.pmnd.rs/getting-started/introduction  Drei docs]&lt;br /&gt;
* [https://discoverthreejs.com/tips-and-tricks/Three.js tips]&lt;br /&gt;
* [https://jotai.org/docs Jotai docs]&lt;br /&gt;
* [https://github.com/developit/mitt/blob/main/README.md Mitt docs]&lt;br /&gt;
* [https://docs.github.com/en/pages GitHub Pages docs]&lt;br /&gt;
&lt;br /&gt;
== Designers Guide ==&lt;br /&gt;
&lt;br /&gt;
=== General Workflow ===&lt;br /&gt;
&lt;br /&gt;
The following design tools were used in the design and development of the project:&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender 5.1]&lt;br /&gt;
* [https://www.figma.com/ Figma]&lt;br /&gt;
* [https://inkscape.org/ Inkscape]&lt;br /&gt;
&lt;br /&gt;
=== Design Files ===&lt;br /&gt;
Relevant design files can be found at:&lt;br /&gt;
* [https://www.figma.com/files/team/1023299720193298363/project/600092140?fuid=1633258275408788061 ATOMIC FIGMA PAGE] - Contains all atomic design work created on figma (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
* [https://www.figma.com/design/lC4zrdgLiHVX255XlKTFQz/MOCK-UI---FINALS---All-Modules---WIP?node-id=60-1142&amp;amp;t=gqAzlBKDI4ZwI2tt-1 MAIN FIGMA DESIGN FILE] - References all current designs and concepts (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;26_design_files&#039;&#039;&#039; folder on GitHub. This includes Blender Files (Contain the bulk of UI development work, containing all the 2D mockups for the overall UI and some visual tests) and Videos + Images (Rendered or exported visuals used as demos or as content within a UI design)&lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Active&#039;&#039;&#039; - Files currently used in design development or containing files that are references/models of the ones used in the current build. &lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Inactive&#039;&#039;&#039; - Files that were used and iterated upon in the design process and have been kept for documentation purposes. &lt;br /&gt;
&lt;br /&gt;
=== Design Framework and Methodology ===&lt;br /&gt;
&lt;br /&gt;
The IMLE was designed referencing existing scientific tools and visualizations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Reference Work&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|William D. Callister, “Materials Science and Engineering”, Wiley, 10th edition&lt;br /&gt;
|Textbook for APSC 278/279 containing various visuals of scientific concepts&lt;br /&gt;
|-&lt;br /&gt;
|Chemical Bonding Simulation&lt;br /&gt;
|Simple atomic bonding sandbox simulation&lt;br /&gt;
|-&lt;br /&gt;
|AtomicLab Sandbox&lt;br /&gt;
|Individual atom builder and analysis toolkit&lt;br /&gt;
|-&lt;br /&gt;
|Unit Cell Visualizer&lt;br /&gt;
|Simple interactive unit cell visualizer&lt;br /&gt;
|-&lt;br /&gt;
|Crystallographic Visualizer&lt;br /&gt;
|Visualizer for crystallographic planes and directions&lt;br /&gt;
|-&lt;br /&gt;
|Flash Tensile Test&lt;br /&gt;
|Flashy Science virtual tensile testing experience&lt;br /&gt;
|-&lt;br /&gt;
|UTM Virtual Lab&lt;br /&gt;
|Analysis oriented tensile testing and graphing tool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IMLE was also designed with consideration of UDL guidelines, key guidelines that influence&lt;br /&gt;
design work for the project include:&lt;br /&gt;
&lt;br /&gt;
*Support opportunities to customize the display of information (1.1) &lt;br /&gt;
*Support multiple ways to perceive information (1.2) &lt;br /&gt;
*Clarify Vocabulary, symbols, and language structures (2.1) &lt;br /&gt;
*Support decoding of text, mathematical notation, and symbols (2.2) &lt;br /&gt;
*Connect prior knowledge to new learning (3.1) &lt;br /&gt;
*Cultivate multiple ways of knowing and making meaning (3.3) &lt;br /&gt;
*Maximize transfer and generalization (3.4) &lt;br /&gt;
*Optimize choice and autonomy (7.1) &lt;br /&gt;
*Nurture joy and play (7.3)&lt;br /&gt;
&lt;br /&gt;
==== Persistent design elements include: ====&lt;br /&gt;
&lt;br /&gt;
*Help tooltip&lt;br /&gt;
*LM/DM button&lt;br /&gt;
*Header module selection&lt;br /&gt;
*General UI layout and organization&lt;br /&gt;
*Asset style and aesthetic&lt;br /&gt;
*Colour consistency&lt;br /&gt;
**Blue Tone - Interactive tools/features&lt;br /&gt;
**Red Tone - Navigation elements&lt;br /&gt;
**Yellow Tone - Help or tutorial elements&lt;br /&gt;
&lt;br /&gt;
A light/dark mode toggle has been designed into the project but has not been implemented yet. A dedicated high contrast mode could also be added in future&lt;br /&gt;
&lt;br /&gt;
=== Design Process ===&lt;br /&gt;
In the creation and development of the designs:&lt;br /&gt;
#Top layer 2D UI design was completed in Figma&lt;br /&gt;
#3D mock ups of interactive content were made in Blender and rendered for use in UI mock-ups&lt;br /&gt;
#2D UI and rendered 3D content were layered in Figma&lt;br /&gt;
&lt;br /&gt;
=== 3D assets ===&lt;br /&gt;
The project uses a toon, cel shaded aesthetic shown in the attached files and reference designs. Textures were created in Blender/EEVEE, before being reformatted for cycles and baked for exporting. This method does not allow for the shaders to react to lighting within the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
[[File:UBC IMLE Poster.jpg|alt=UBC IMLE Poster|center|thumb|800x800px|&#039;&#039;&#039;UBC IMLE Poster&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=File:UBC_IMLE_Poster.jpg&amp;diff=903595</id>
		<title>File:UBC IMLE Poster.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=File:UBC_IMLE_Poster.jpg&amp;diff=903595"/>
		<updated>2026-08-21T22:47:36Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Uploaded a work by UBC EML from Created for the IMLE project at UBC EML with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=31st July - UBC IMLE Poster}}&lt;br /&gt;
|date=2026-07-31&lt;br /&gt;
|source=Created for the IMLE project at UBC EML&lt;br /&gt;
|author=UBC EML&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{cr-ubc}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903594</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903594"/>
		<updated>2026-08-21T22:45:01Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Atomic Bonding Module: ===&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Unit Cell (Crystal) Module: ===&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
=== Lattice Defects Module: ===&lt;br /&gt;
[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
=== Tensile Testing (Lab) Module: ===&lt;br /&gt;
[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
=== Graph Analysis Module: ===&lt;br /&gt;
[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at docs/modules.md, as well as on this wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* [https://react.dev/reference/react React docs]&lt;br /&gt;
* [https://threejs.org/docs/ Three.js docs]&lt;br /&gt;
* [https://r3f.docs.pmnd.rs/getting-started/introduction R3F docs]&lt;br /&gt;
* [https://drei.docs.pmnd.rs/getting-started/introduction  Drei docs]&lt;br /&gt;
* [https://discoverthreejs.com/tips-and-tricks/Three.js tips]&lt;br /&gt;
* [https://jotai.org/docs Jotai docs]&lt;br /&gt;
* [https://github.com/developit/mitt/blob/main/README.md Mitt docs]&lt;br /&gt;
* [https://docs.github.com/en/pages GitHub Pages docs]&lt;br /&gt;
&lt;br /&gt;
== Designers Guide ==&lt;br /&gt;
&lt;br /&gt;
=== General Workflow ===&lt;br /&gt;
&lt;br /&gt;
The following design tools were used in the design and development of the project:&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender 5.1]&lt;br /&gt;
* [https://www.figma.com/ Figma]&lt;br /&gt;
* [https://inkscape.org/ Inkscape]&lt;br /&gt;
&lt;br /&gt;
=== Design Files ===&lt;br /&gt;
Relevant design files can be found at:&lt;br /&gt;
* [https://www.figma.com/files/team/1023299720193298363/project/600092140?fuid=1633258275408788061 ATOMIC FIGMA PAGE] - Contains all atomic design work created on figma (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
* [https://www.figma.com/design/lC4zrdgLiHVX255XlKTFQz/MOCK-UI---FINALS---All-Modules---WIP?node-id=60-1142&amp;amp;t=gqAzlBKDI4ZwI2tt-1 MAIN FIGMA DESIGN FILE] - References all current designs and concepts (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;26_design_files&#039;&#039;&#039; folder on GitHub. This includes Blender Files (Contain the bulk of UI development work, containing all the 2D mockups for the overall UI and some visual tests) and Videos + Images (Rendered or exported visuals used as demos or as content within a UI design)&lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Active&#039;&#039;&#039; - Files currently used in design development or containing files that are references/models of the ones used in the current build. &lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Inactive&#039;&#039;&#039; - Files that were used and iterated upon in the design process and have been kept for documentation purposes. &lt;br /&gt;
&lt;br /&gt;
=== Design Framework and Methodology ===&lt;br /&gt;
&lt;br /&gt;
The IMLE was designed referencing existing scientific tools and visualizations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Reference Work&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|William D. Callister, “Materials Science and Engineering”, Wiley, 10th edition&lt;br /&gt;
|Textbook for APSC 278/279 containing various visuals of scientific concepts&lt;br /&gt;
|-&lt;br /&gt;
|Chemical Bonding Simulation&lt;br /&gt;
|Simple atomic bonding sandbox simulation&lt;br /&gt;
|-&lt;br /&gt;
|AtomicLab Sandbox&lt;br /&gt;
|Individual atom builder and analysis toolkit&lt;br /&gt;
|-&lt;br /&gt;
|Unit Cell Visualizer&lt;br /&gt;
|Simple interactive unit cell visualizer&lt;br /&gt;
|-&lt;br /&gt;
|Crystallographic Visualizer&lt;br /&gt;
|Visualizer for crystallographic planes and directions&lt;br /&gt;
|-&lt;br /&gt;
|Flash Tensile Test&lt;br /&gt;
|Flashy Science virtual tensile testing experience&lt;br /&gt;
|-&lt;br /&gt;
|UTM Virtual Lab&lt;br /&gt;
|Analysis oriented tensile testing and graphing tool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IMLE was also designed with consideration of UDL guidelines, key guidelines that influence&lt;br /&gt;
design work for the project include:&lt;br /&gt;
&lt;br /&gt;
*Support opportunities to customize the display of information (1.1) &lt;br /&gt;
*Support multiple ways to perceive information (1.2) &lt;br /&gt;
*Clarify Vocabulary, symbols, and language structures (2.1) &lt;br /&gt;
*Support decoding of text, mathematical notation, and symbols (2.2) &lt;br /&gt;
*Connect prior knowledge to new learning (3.1) &lt;br /&gt;
*Cultivate multiple ways of knowing and making meaning (3.3) &lt;br /&gt;
*Maximize transfer and generalization (3.4) &lt;br /&gt;
*Optimize choice and autonomy (7.1) &lt;br /&gt;
*Nurture joy and play (7.3)&lt;br /&gt;
&lt;br /&gt;
==== Persistent design elements include: ====&lt;br /&gt;
&lt;br /&gt;
*Help tooltip&lt;br /&gt;
*LM/DM button&lt;br /&gt;
*Header module selection&lt;br /&gt;
*General UI layout and organization&lt;br /&gt;
*Asset style and aesthetic&lt;br /&gt;
*Colour consistency&lt;br /&gt;
**Blue Tone - Interactive tools/features&lt;br /&gt;
**Red Tone - Navigation elements&lt;br /&gt;
**Yellow Tone - Help or tutorial elements&lt;br /&gt;
&lt;br /&gt;
A light/dark mode toggle has been designed into the project but has not been implemented yet.&lt;br /&gt;
&lt;br /&gt;
A dedicated high contrast mode could also be added in future&lt;br /&gt;
&lt;br /&gt;
=== Design Process ===&lt;br /&gt;
In the creation and development of the designs:&lt;br /&gt;
#Top layer 2D UI design was completed in Figma&lt;br /&gt;
#3D mock ups of interactive content were made in Blender and rendered for use in UI mock-ups&lt;br /&gt;
#2D UI and rendered 3D content were layered in Figma&lt;br /&gt;
&lt;br /&gt;
=== 3D assets ===&lt;br /&gt;
The project uses a toon, cel shaded aesthetic shown in the attached files and reference designs.&lt;br /&gt;
&lt;br /&gt;
Textures were created in Blender/EEVEE, before being reformatted for cycles and baked for exporting.&lt;br /&gt;
&lt;br /&gt;
This method does not allow for the shaders to react to lighting within the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=File:UBC_IMLE_Poster.pdf&amp;diff=903593</id>
		<title>File:UBC IMLE Poster.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=File:UBC_IMLE_Poster.pdf&amp;diff=903593"/>
		<updated>2026-08-21T22:43:35Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Uploaded a work by UBC EML from Created for the EML for the IMLE project with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=UBC IMLE Poster}}&lt;br /&gt;
|date=2026-07-31&lt;br /&gt;
|source=Created for the EML for the IMLE project&lt;br /&gt;
|author=UBC EML&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{cr-ubc}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903592</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903592"/>
		<updated>2026-08-21T22:40:10Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Atomic Bonding Module: ===&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Unit Cell (Crystal) Module: ===&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
=== Lattice Defects Module: ===&lt;br /&gt;
[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
=== Tensile Testing (Lab) Module: ===&lt;br /&gt;
[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
=== Graph Analysis Module: ===&lt;br /&gt;
[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at docs/modules.md, as well as on this wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* [https://react.dev/reference/react React docs]&lt;br /&gt;
* [https://threejs.org/docs/ Three.js docs]&lt;br /&gt;
* [https://r3f.docs.pmnd.rs/getting-started/introduction R3F docs]&lt;br /&gt;
* [https://drei.docs.pmnd.rs/getting-started/introduction  Drei docs]&lt;br /&gt;
* [https://discoverthreejs.com/tips-and-tricks/Three.js tips]&lt;br /&gt;
* [https://jotai.org/docs Jotai docs]&lt;br /&gt;
* [https://github.com/developit/mitt/blob/main/README.md Mitt docs]&lt;br /&gt;
* [https://docs.github.com/en/pages GitHub Pages docs]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Designers Guide ==&lt;br /&gt;
&lt;br /&gt;
=== General Workflow ===&lt;br /&gt;
&lt;br /&gt;
The following design tools were used in the design and development of the project:&lt;br /&gt;
&lt;br /&gt;
* [https://www.blender.org/ Blender 5.1]&lt;br /&gt;
* [https://www.figma.com/ Figma]&lt;br /&gt;
* [https://inkscape.org/ Inkscape]&lt;br /&gt;
&lt;br /&gt;
=== Design Files ===&lt;br /&gt;
Relevant design files can be found at:&lt;br /&gt;
* [https://www.figma.com/files/team/1023299720193298363/project/600092140?fuid=1633258275408788061 ATOMIC FIGMA PAGE] - Contains all atomic design work created on figma (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
* [https://www.figma.com/design/lC4zrdgLiHVX255XlKTFQz/MOCK-UI---FINALS---All-Modules---WIP?node-id=60-1142&amp;amp;t=gqAzlBKDI4ZwI2tt-1 MAIN FIGMA DESIGN FILE] - References all current designs and concepts (you must have access to the &amp;quot;Emerging Media Lab&amp;quot; on figma to access)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;26_design_files&#039;&#039;&#039; folder on GitHub. This includes Blender Files (Contain the bulk of UI development work, containing all the 2D mockups for the overall UI and some visual tests) and Videos + Images (Rendered or exported visuals used as demos or as content within a UI design)&lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Active&#039;&#039;&#039; - Files currently used in design development or containing files that are references/models of the ones used in the current build. &lt;br /&gt;
** &#039;&#039;&#039;26_design_files/Inactive&#039;&#039;&#039; - Files that were used and iterated upon in the design process and have been kept for documentation purposes. &lt;br /&gt;
&lt;br /&gt;
=== Design Framework and Methodology ===&lt;br /&gt;
&lt;br /&gt;
The IMLE was designed referencing existing scientific tools and visualizations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Reference Work&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|William D. Callister, “Materials Science and Engineering”, Wiley, 10th edition&lt;br /&gt;
|Textbook for APSC 278/279 containing various visuals of scientific concepts&lt;br /&gt;
|-&lt;br /&gt;
|Chemical Bonding Simulation&lt;br /&gt;
|Simple atomic bonding sandbox simulation&lt;br /&gt;
|-&lt;br /&gt;
|AtomicLab Sandbox&lt;br /&gt;
|Individual atom builder and analysis toolkit&lt;br /&gt;
|-&lt;br /&gt;
|Unit Cell Visualizer&lt;br /&gt;
|Simple interactive unit cell visualizer&lt;br /&gt;
|-&lt;br /&gt;
|Crystallographic Visualizer&lt;br /&gt;
|Visualizer for crystallographic planes and directions&lt;br /&gt;
|-&lt;br /&gt;
|Flash Tensile Test&lt;br /&gt;
|Flashy Science virtual tensile testing experience&lt;br /&gt;
|-&lt;br /&gt;
|UTM Virtual Lab&lt;br /&gt;
|Analysis oriented tensile testing and graphing tool&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The IMLE was also designed with consideration of UDL guidelines, key guidelines that influence&lt;br /&gt;
design work for the project include:&lt;br /&gt;
&lt;br /&gt;
*Support opportunities to customize the display of information (1.1) &lt;br /&gt;
*Support multiple ways to perceive information (1.2) &lt;br /&gt;
*Clarify Vocabulary, symbols, and language structures (2.1) &lt;br /&gt;
*Support decoding of text, mathematical notation, and symbols (2.2) &lt;br /&gt;
*Connect prior knowledge to new learning (3.1) &lt;br /&gt;
*Cultivate multiple ways of knowing and making meaning (3.3) &lt;br /&gt;
*Maximize transfer and generalization (3.4) &lt;br /&gt;
*Optimize choice and autonomy (7.1) &lt;br /&gt;
*Nurture joy and play (7.3)&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903591</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903591"/>
		<updated>2026-08-21T22:27:01Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Atomic Bonding Module: ===&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Unit Cell (Crystal) Module: ===&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
=== Lattice Defects Module: ===&lt;br /&gt;
[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
=== Tensile Testing (Lab) Module: ===&lt;br /&gt;
[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
=== Graph Analysis Module: ===&lt;br /&gt;
[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here &lt;br /&gt;
&lt;br /&gt;
develop - development branch, deployed here &lt;br /&gt;
&lt;br /&gt;
Do not merge directly to main , all commits must go through develop. Ideally branch off of develop before pushing.&lt;br /&gt;
&lt;br /&gt;
develop before pushing&lt;br /&gt;
&lt;br /&gt;
=== NPM Packages Overview ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Non Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@react-spring/three&lt;br /&gt;
|used for animating state changes in 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/csg&lt;br /&gt;
|used for creating csg meshes for 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/drei&lt;br /&gt;
|helpers for rendering 3d scenes; premade components&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/fiber&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@react-three/postprocessing&lt;br /&gt;
|used for post processing of 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|@visx/visx&lt;br /&gt;
|react friendly visual primitives - currently used for the graphs in the lab module&lt;br /&gt;
|-&lt;br /&gt;
|clsx&lt;br /&gt;
|conditionally merge css module classes for react&lt;br /&gt;
|-&lt;br /&gt;
|react-moveable&lt;br /&gt;
|draggable HTML components&lt;br /&gt;
|-&lt;br /&gt;
|papaparse&lt;br /&gt;
|csv parsing&lt;br /&gt;
|-&lt;br /&gt;
|jotai&lt;br /&gt;
|global state management&lt;br /&gt;
|-&lt;br /&gt;
|lightningcss&lt;br /&gt;
|css parser used for builds&lt;br /&gt;
|-&lt;br /&gt;
|mitt&lt;br /&gt;
|event system&lt;br /&gt;
|-&lt;br /&gt;
|priority-queue-typescript&lt;br /&gt;
|priority queue data structure implementation&lt;br /&gt;
|-&lt;br /&gt;
|react&lt;br /&gt;
|it&#039;s react.&lt;br /&gt;
|-&lt;br /&gt;
|react-dom&lt;br /&gt;
|it&#039;s react (but again)&lt;br /&gt;
|-&lt;br /&gt;
|three&lt;br /&gt;
|used for rendering 3d scenes&lt;br /&gt;
|-&lt;br /&gt;
|usehooks-ts&lt;br /&gt;
|additional hooks for react&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Dev-only&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Package&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/core&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@emnapi/runtime&lt;br /&gt;
|WebAssembly support&lt;br /&gt;
|-&lt;br /&gt;
|@eslint/js&lt;br /&gt;
|JavaScript linter&lt;br /&gt;
|-&lt;br /&gt;
|@stylistic/eslint-plugin&lt;br /&gt;
|linter rules&lt;br /&gt;
|-&lt;br /&gt;
|@types/node&lt;br /&gt;
|types for node (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/papaparse&lt;br /&gt;
|types for papaparse (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@types/react-dom&lt;br /&gt;
|types for react (see above)&lt;br /&gt;
|-&lt;br /&gt;
|@vitejs/plugin-react&lt;br /&gt;
|react support for vite&lt;br /&gt;
|-&lt;br /&gt;
|eslint&lt;br /&gt;
|linter&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-hooks&lt;br /&gt;
|linter for react hooks&lt;br /&gt;
|-&lt;br /&gt;
|eslint-plugin-react-refresh&lt;br /&gt;
|vite compatible linter&lt;br /&gt;
|-&lt;br /&gt;
|globals&lt;br /&gt;
|collection of global identifier reference environments for ESLint&lt;br /&gt;
|-&lt;br /&gt;
|typedoc&lt;br /&gt;
|documentation generator&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-markdown&lt;br /&gt;
|render TypeDoc as Markdown files&lt;br /&gt;
|-&lt;br /&gt;
|typedoc-plugin-rename-defaults&lt;br /&gt;
|customize TypeDoc default module and page names&lt;br /&gt;
|-&lt;br /&gt;
|typescript&lt;br /&gt;
|it&#039;s typescript&lt;br /&gt;
|-&lt;br /&gt;
|typescript-eslint&lt;br /&gt;
|ESLint support for typescript&lt;br /&gt;
|-&lt;br /&gt;
|vite&lt;br /&gt;
|frontend build tool and dev server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Folders === &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Folder&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|src&lt;br /&gt;
|all the code&lt;br /&gt;
|-&lt;br /&gt;
|src/components&lt;br /&gt;
|all react components&lt;br /&gt;
|-&lt;br /&gt;
|src/data&lt;br /&gt;
|class, interface, and type definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/events&lt;br /&gt;
|mitt event defintions&lt;br /&gt;
|-&lt;br /&gt;
|src/scripts&lt;br /&gt;
|additional typescript helper functions and data storage&lt;br /&gt;
|-&lt;br /&gt;
|src/state&lt;br /&gt;
|jotai global state definitions&lt;br /&gt;
|-&lt;br /&gt;
|src/main.tsx&lt;br /&gt;
|entry point&lt;br /&gt;
|-&lt;br /&gt;
|public/assets&lt;br /&gt;
|all assets for the project&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/data&lt;br /&gt;
|csv data files for tensile tests in module 4 and 5&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/fonts&lt;br /&gt;
|font files&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/models&lt;br /&gt;
|glb models&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/textures&lt;br /&gt;
|2d images: svg, png, webp&lt;br /&gt;
|-&lt;br /&gt;
|public/assets/typefaces&lt;br /&gt;
|special json files for rendering 3d text&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Project Documentation ===&lt;br /&gt;
Documentation for the codebase can be found at [`docs/modules.md`](docs/modules.md).&lt;br /&gt;
&lt;br /&gt;
### Resources&lt;br /&gt;
- [React docs]&lt;br /&gt;
- [Three.js docs]&lt;br /&gt;
- [R3F docs]&lt;br /&gt;
- [Drei docs]&lt;br /&gt;
- [Three.js tips]&lt;br /&gt;
- [Jotai docs]&lt;br /&gt;
- [Mitt docs]&lt;br /&gt;
- [GitHub Pages docs]&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903590</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903590"/>
		<updated>2026-08-21T22:21:46Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Atomic Bonding Module: ===&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Unit Cell (Crystal) Module: ===&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
=== Lattice Defects Module: ===&lt;br /&gt;
[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
=== Tensile Testing (Lab) Module: ===&lt;br /&gt;
[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
=== Graph Analysis Module: ===&lt;br /&gt;
[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
== Feature Status ==&lt;br /&gt;
&lt;br /&gt;
The trello board can be accessed [https://trello.com/b/Vyxz027P/26-1001-atomic here].&lt;br /&gt;
* &#039;&#039;&#039;DONE&#039;&#039;&#039;: Major feature that is complete  &lt;br /&gt;
* &#039;&#039;&#039;TODO&#039;&#039;&#039;: Major feature that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;BUG&#039;&#039;&#039;: Bug that needs to be fixed  &lt;br /&gt;
* &#039;&#039;&#039;TWEAK&#039;&#039;&#039;: Minor feature or change that is incomplete  &lt;br /&gt;
* &#039;&#039;&#039;STRETCH&#039;&#039;&#039;: Stetch goal that is incomplete&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Feature Status&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! General&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Page navigation&lt;br /&gt;
|Users can navigate to different modules using a top navigation menu&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Help button&lt;br /&gt;
|Users can access instructional information for each module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Color Blind Assessment&lt;br /&gt;
|Adjust all colors in the app to be suitable for use for color blind users&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Light/Dark Mode Toggle&lt;br /&gt;
|Add a toggle to switch between light and dark modes&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Tooltips&lt;br /&gt;
|Users can highlight over different components and get useful information about what they are/do (e.g. APF = atomic packing factor)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Native cell shader rendering&lt;br /&gt;
|Currently textures are baked onto 3d models, switching to native rendering will reduce file sizes (no textures) and gives more programmatic control over materials (e.g. dynamically changing colors)&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Mobile support&lt;br /&gt;
|Make the app work with touch controls, vertical displays and small displays&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|Sound Effects&lt;br /&gt;
|Add sound effects for different parts of the app&lt;br /&gt;
|-&lt;br /&gt;
|Stretch&lt;br /&gt;
|UI Animations / Effects&lt;br /&gt;
|Add additional animations to the UI across the app&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Atomic Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom rendering&lt;br /&gt;
|atoms are rendered with accurate atomic radii and electron counts&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom dragging&lt;br /&gt;
|users can drag atoms around a bounded 2d world to move them&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom snapping&lt;br /&gt;
|when atoms move close to a bonding position, they automatically snap into ideal bonding locations&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Camera controls&lt;br /&gt;
|users can move the camera around the bounded 2d world by dragging and zooming&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Ionic bonding&lt;br /&gt;
|ionic bonds form between atoms and electrons are transferred from one atom to another&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Covalent bonding&lt;br /&gt;
|covalent bonds form between atoms with electrons being shared between atoms&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Metallic bonding&lt;br /&gt;
|metallic bonds form between atoms with electrons animating in a &amp;quot;sea of electrons&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom info panel&lt;br /&gt;
|users can click on atoms to learn useful information such as their atomic mass&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Bond info panel&lt;br /&gt;
|users can click on bonds to learn useful information such as their ΔEN&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Periodic table for adding atoms&lt;br /&gt;
|users can add atoms to the world by dragging them in from a periodic table&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Button for deleting atoms&lt;br /&gt;
|users can delete atoms (found on the atom info panel)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Hydrogen bonding&lt;br /&gt;
|hydrogen bonds form between atoms and are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Van der walls bonding&lt;br /&gt;
|van der walls bonds form between atoms are distinctively rendered&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Camera controls ui&lt;br /&gt;
|users can use arrow UI to move the camera around the scene&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Ionic lattices&lt;br /&gt;
|users can form lattices out of ionic bonds (e.g. NaCl crystal)&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Preset loading&lt;br /&gt;
|users can use a drop down menu to load preset atom configurations (e.g. aluminum lattice), so they don&#039;t have to manually construct them&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|Electron Bug&lt;br /&gt;
|Electrons can fly off when deleting atoms from metallic bonds&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond interaction&lt;br /&gt;
|Make metallic bonds clickable over the entire sea of electrons&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Optimization&lt;br /&gt;
|Optimize the rendering of electrons so that they are not reloaded whenever an atom is added/removed&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|Metallic bond visual&lt;br /&gt;
|Render a backdrop for the atomic sea of metallic bonds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Unit Cell Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell rendering&lt;br /&gt;
|Unit cells can be rendered in Reduced, Normal and Cutoff modes&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal info panel&lt;br /&gt;
|Users can see useful info about the current crystal type including APF&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Crystal type control&lt;br /&gt;
|Users can change which crystal type is currently being shown&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell expansion control&lt;br /&gt;
|Users can expand unit cells away from each other and hide all but 1 unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Unit cell transparency control&lt;br /&gt;
|Users can change the transparency of atoms in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions calculation&lt;br /&gt;
|Users can calculate the dimensions of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Dimensions axes&lt;br /&gt;
|Axes representing the different dimensions are rendered while calucation dimensions. Users can click on dimension variables in equations to see which axes it represents&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count calculation&lt;br /&gt;
|Users can calculate the atom count in a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Atom count highlighting&lt;br /&gt;
|Users can see which atoms align to which parts of the calculation&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Apf calculation&lt;br /&gt;
|Users can calculate the APF of a unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Coordination number toy&lt;br /&gt;
|Users can see a special view of the crystal to count the coordination number&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Fix highlight toys for APF, $V_a$ should highlight all the atoms and $V_{uc}$ should highlight the entire cube taken up by the unit cell&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|No other calculations should be able to be enabled while Coord. Number calculation is active.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Find a way to synchonize the flashing animations between html/css components (e.g. calculation symbols) and r3f components (e.g. unit cells, axis)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lattice Defect Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect rendering&lt;br /&gt;
|Four different types of point defect are randomly generated and rendered within a 2D lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Point defect UI&lt;br /&gt;
|Changing bond colors depending on their length can be toggled&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation rendering&lt;br /&gt;
|Multiple edge dislocations are generated within a 3D lattice, alongisde their Burger&#039;s vectors&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation movement&lt;br /&gt;
|Edge dislocations can be translated left and right by shearing the bottom half of the lattice&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Edge dislocation UI&lt;br /&gt;
|Background layer opacity and the presence of Burger&#039;s vectors can be configured&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation rendering&lt;br /&gt;
|A screw dislocation is rendered within a 3D lattice, alongside its dislocation line&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation movement&lt;br /&gt;
|The screw dislocation can be translated left and right by shearing the two halves up and down&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Screw dislocation UI&lt;br /&gt;
|Unit cell face opacity, the presence of the dislocation line, and the highlighting of the screw dislocation bonds can be configured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Lab Testing Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample storage containers&lt;br /&gt;
|Users can spawn samples of different materials onto the measuring mat by clicking on the storage containers&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Measuring mat / Draggable samples&lt;br /&gt;
|Students can drag samples around a measuring mat. Samples are rendered based on how much they have been elongated.&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Caliper&lt;br /&gt;
|Students can use a virtual caliper to measure the samples&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Sample holder&lt;br /&gt;
|Students can move samples over to a sample holder to take to the experiment page&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine assembly&lt;br /&gt;
|Students can assemble a tensile test machine using parts found in an actual tensile testing machine&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Machine animation&lt;br /&gt;
|The machine animates as users elongate the sample&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Force(N) / Elongation (mm) graph shows the current and historical state of a sample&lt;br /&gt;
|-&lt;br /&gt;
|Bug&lt;br /&gt;
|&lt;br /&gt;
|Sometimes samples do not render with the proper elongation.&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Make sub page navigation button not rely solely on an image (only the arrow should be an image).&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add dot tracker to tensile graph to show current point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Data Analysis Module&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Task&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Macroscopic view&lt;br /&gt;
|A zoomed in version of a physical tensile test from the Lab module&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Material selector&lt;br /&gt;
|Menu for selecting which material to analyze&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph&lt;br /&gt;
|A Stress/Strain graph, with key points marked and descriptors for the key points when they are hovered&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Elongation controls&lt;br /&gt;
|Users can elongate samples using the elongation controls, and also reset the elongation with a reset button&lt;br /&gt;
|-&lt;br /&gt;
|Done&lt;br /&gt;
|Graph information panel&lt;br /&gt;
|A panel showing the current stress, strain and deformation type of the sample&lt;br /&gt;
|-&lt;br /&gt;
|Todo&lt;br /&gt;
|Microscopic view&lt;br /&gt;
|A bubble raft model of the material, showing the movement of point dislocations across the sample&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Fix the rendering of graph sections for various samples, as the sharp increase in stress and the beginning of most tests causes the section labels to be rendered under the graph line&lt;br /&gt;
|-&lt;br /&gt;
|Tweak&lt;br /&gt;
|&lt;br /&gt;
|Add Stress/Strain information to key points info panels.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developers Guide == &lt;br /&gt;
This is a React project that renders 3d scenes using React Three Fiber. It is built using vite and deployed via GitHub Pages. Source code is stored on GitHub. &lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
#Install node &lt;br /&gt;
#Run npm install (in the root project directory) &lt;br /&gt;
#Install vscode &lt;br /&gt;
#Install the ESLint extension &lt;br /&gt;
=== Building / Deployment === &lt;br /&gt;
#Create build ( npm run build ) &lt;br /&gt;
#Push/merge changes to main or develop &lt;br /&gt;
#Check the GitHub Pages page for any errors in deploying &lt;br /&gt;
&lt;br /&gt;
=== Commands Cheat Sheet === &lt;br /&gt;
*&#039;&#039;&#039;npm run dev&#039;&#039;&#039; - run a local development build with hot reload&lt;br /&gt;
*&#039;&#039;&#039;npm run build&#039;&#039;&#039; - create a production build &lt;br /&gt;
*&#039;&#039;&#039;npm run preview&#039;&#039;&#039; - preview the production build &lt;br /&gt;
*&#039;&#039;&#039;npm run lint&#039;&#039;&#039; - run the linter &lt;br /&gt;
*&#039;&#039;&#039;npm run docs&#039;&#039;&#039; - regenerate the typedoc documentation&lt;br /&gt;
&lt;br /&gt;
=== Git Branches ===&lt;br /&gt;
main - production branch, deployed here develop - development branch, deployed here Do not merge directly to main , all commits must go through develop before pushing. develop . Ideally branch off of NPM Packages Overview Non Dev-only @react-spring/three - used for animating state changes in 3d scenes @react-three/csg - used for creating csg meshes for 3d scenes @react-three/drei - helpers for rendering 3d scenes; premade components @react-three/fiber - used for rendering 3d scenes @react-three/postprocessing - used for post processing of 3d scenes @visx/visx - react friendly visual primitives - currently used for the graphs in the lab module clsx - conditionally merge css module classes for react react-moveable - draggable HTML components papaparse - csv parsing jotai - global state management lightningcss - css parser used for builds mitt - event system priority-queue-typescript - priority queue data structure implementation react - it&#039;s react. react-dom - it&#039;s react (but again) three - used for rendering 3d scenes usehooks-ts - additional hooks for react Dev-only @emnapi/core - WebAssembly support @emnapi/runtime - WebAssembly support @eslint/js - JavaScript linter @stylistic/eslint-plugin - linter rules @types/node - types for node (see above) @types/papaparse - types for papaparse (see above) @types/react - types for react (see above) @types/react-dom - types for react (see above) @vitejs/plugin-react - react support for vite eslint - linter eslint-plugin-react-hooks - linter for react hooks eslint-plugin-react-refresh - vite compatible linter globals - collection of global identifier reference environments for ESLint typedoc - documentation generator typedoc-plugin-markdown - render TypeDoc as Markdown files typedoc-plugin-rename-defaults - customize TypeDoc default module and page names typescript - it&#039;s typescript typescript-eslint - ESLint support for typescript vite - frontend build tool and dev server Project Folders src - all the code src/components - all react components src/data - class, interface, and type definitions src/events - mitt event defintions src/scripts - additional typescript helper functions and data storage src/state - jotai global state definitions src/main.tsx - entry point public/assets - all assets for the project public/assets/data - csv data files for tensile tests in module 4 and 5 public/assets/fonts - font files public/assets/models - glb models public/assets/textures - 2d images: svg, png, webp public/assets/typefaces - special json files for rendering 3d text Project Documentation Documentation for the codebase can be found at Resources React docs Three.js docs R3F docs Drei docs Three.js tips Jotai docs Mitt docs GitHub Pages docs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903588</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903588"/>
		<updated>2026-08-21T21:54:36Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: /* IMLE (Immersive Materials Learning Environment) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
== Context ==&lt;br /&gt;
Before development, several barriers to student learning were identified, revealing a common risk pathway that guided IMLE’s design and intended role. &lt;br /&gt;
[[File:IMLE - Diagram 02.png|alt=IMLE - Diagram 02 - Course Conditions|none|thumb|434x434px|Identified existing course conditions]]&lt;br /&gt;
[[File:IMLE - Diagram 01.png|alt=IMLE - Diagram 01 - Student Risks|none|thumb|433x433px|Identified student risk pathways]]&lt;br /&gt;
&lt;br /&gt;
== Project Details ==&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
[[File:IMLE - Module 1.png|alt=IMLE - Module 1 Screenshot|thumb|300x300px|IMLE - Module 1 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Atomic Bonding Module: ===&lt;br /&gt;
Students select elements from an interactive periodic table to explore which elements they are likely to bond with and the resulting bond type.&lt;br /&gt;
[[File:IMLE - Module 2.png|alt=IMLE - Module 2 Screenshot|thumb|IMLE - Module 2 Screenshot]]&lt;br /&gt;
&lt;br /&gt;
=== Unit Cell (Crystal) Module: ===&lt;br /&gt;
Students interact with unit cells to visualize atomic arrangements in different crystal structures and determine key characteristics such as coordination number and atomic packing factor.&lt;br /&gt;
&lt;br /&gt;
=== Lattice Defects Module: ===&lt;br /&gt;
[[File:IMLE - Module 3.png|alt=IMLE - Module 3 Screenshot|thumb|IMLE - Module 3 Screenshot]]&lt;br /&gt;
Students explore different lattice defects, visualize their structures, and examine how they move and distort the surrounding lattice.&lt;br /&gt;
&lt;br /&gt;
=== Tensile Testing (Lab) Module: ===&lt;br /&gt;
[[File:IMLE - Module 4.png|alt=IMLE - Module 4 Screenshot|thumb|IMLE - Module 4 Screenshot]]&lt;br /&gt;
Students independently perform virtual tensile tests on a wide range of materials without the equipment, safety, or specimen limitations of a physical laboratory.&lt;br /&gt;
&lt;br /&gt;
=== Graph Analysis Module: ===&lt;br /&gt;
[[File:IMLE - Module 5.png|alt=IMLE - Module 5 Screenshot|thumb|IMLE - Module 5 Screenshot]]&lt;br /&gt;
Students explore an interactive graph to understand how different material’s physical properties, and atomic structure change and evolve during a tensile test&lt;br /&gt;
&lt;br /&gt;
== App deployment ==&lt;br /&gt;
Currently the app is hosted using Github Pages, from [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/develop this] repo. &lt;br /&gt;
&lt;br /&gt;
There are two versions deployed, the full domain names for both are: &lt;br /&gt;
&lt;br /&gt;
Production: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/ Production Build]&lt;br /&gt;
&lt;br /&gt;
Development: [https://ubcemergingmedialab.github.io/26---1001-ATOMIC/dev/ Developement Build]&lt;br /&gt;
&lt;br /&gt;
The two deployments are made automatically whenever code is submitted to the main branch for production, and development branch for the development deployment. &lt;br /&gt;
&lt;br /&gt;
This is done through the Github Workflows found here: [https://github.com/ubcemergingmedialab/26---1001-ATOMIC/tree/main/.github/workflows Github Workflow]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Poster ==&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=File:IMLE_-_Diagram_01.png&amp;diff=903584</id>
		<title>File:IMLE - Diagram 01.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=File:IMLE_-_Diagram_01.png&amp;diff=903584"/>
		<updated>2026-08-21T21:38:47Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Uploaded a work by UBC EML from Created for the IMLE project within the EML at UBC with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=Diagram showing the student risks for the IMLE project}}&lt;br /&gt;
|date=2026-08-21&lt;br /&gt;
|source=Created for the IMLE project within the EML at UBC&lt;br /&gt;
|author=UBC EML&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{cr-ubc}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=File:IMLE_-_Diagram_02.png&amp;diff=903583</id>
		<title>File:IMLE - Diagram 02.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=File:IMLE_-_Diagram_02.png&amp;diff=903583"/>
		<updated>2026-08-21T21:38:47Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Uploaded a work by UBC EML from Created for the IMLE project within the EML at UBC with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=Diagram showing the course conditions for the IMLE project}}&lt;br /&gt;
|date=2026-08-21&lt;br /&gt;
|source=Created for the IMLE project within the EML at UBC&lt;br /&gt;
|author=UBC EML&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{cr-ubc}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_5.png&amp;diff=903582</id>
		<title>File:IMLE - Module 5.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_5.png&amp;diff=903582"/>
		<updated>2026-08-21T21:30:01Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Uploaded a work by EML, UBC from Created as part of the IMLE project with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=IMLE Module 5 Image}}&lt;br /&gt;
|date=2026-08-21&lt;br /&gt;
|source=Created as part of the IMLE project&lt;br /&gt;
|author=EML, UBC&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{cr-ubc}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_4.png&amp;diff=903581</id>
		<title>File:IMLE - Module 4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_4.png&amp;diff=903581"/>
		<updated>2026-08-21T21:30:01Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Uploaded a work by EML, UBC from Created as part of the IMLE project with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=IMLE Module 4 Image}}&lt;br /&gt;
|date=2026-08-21&lt;br /&gt;
|source=Created as part of the IMLE project&lt;br /&gt;
|author=EML, UBC&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{cr-ubc}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_2.png&amp;diff=903580</id>
		<title>File:IMLE - Module 2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_2.png&amp;diff=903580"/>
		<updated>2026-08-21T21:30:01Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Uploaded a work by EML, UBC from Created as part of the IMLE project with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=IMLE Module 2 Image}}&lt;br /&gt;
|date=2026-08-21&lt;br /&gt;
|source=Created as part of the IMLE project&lt;br /&gt;
|author=EML, UBC&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{cr-ubc}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_1.png&amp;diff=903579</id>
		<title>File:IMLE - Module 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_1.png&amp;diff=903579"/>
		<updated>2026-08-21T21:30:01Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Uploaded a work by EML, UBC from Created as part of the IMLE project with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=IMLE Module 1 Image}}&lt;br /&gt;
|date=2026-08-21&lt;br /&gt;
|source=Created as part of the IMLE project&lt;br /&gt;
|author=EML, UBC&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{cr-ubc}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_3.png&amp;diff=903578</id>
		<title>File:IMLE - Module 3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=File:IMLE_-_Module_3.png&amp;diff=903578"/>
		<updated>2026-08-21T21:30:01Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Uploaded a work by EML, UBC from Created as part of the IMLE project with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=IMLE Module 3 Image}}&lt;br /&gt;
|date=2026-08-21&lt;br /&gt;
|source=Created as part of the IMLE project&lt;br /&gt;
|author=EML, UBC&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{cr-ubc}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903518</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903518"/>
		<updated>2026-08-19T23:51:18Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903517</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903517"/>
		<updated>2026-08-19T23:50:00Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903516</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903516"/>
		<updated>2026-08-19T23:48:54Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: setting up this page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{infobox Emerging Media Lab}}&lt;br /&gt;
&lt;br /&gt;
= IMLE (Immersive Materials Learning Environment) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Immersive Materials Learning Environment is a browser-based, interactive learning tool for APSC 278/279 and MECH 221, core second year materials science and engineering courses that serve nearly 700 students from different engineering disciplines annually. By providing experiential access to concepts that are otherwise difficult or impossible to observe or practice, the IMLE promotes deep learning and higher-order cognitive engagement, enabling students to move beyond memorization toward application of concepts to real-world engineering problems.&lt;br /&gt;
&lt;br /&gt;
The current IMLE project includes 5 interactive modules aligned with selected course topics:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
==== Principal Investigators (PI): ====&lt;br /&gt;
&lt;br /&gt;
* Dr. Farzaneh Farhang Mehr&lt;br /&gt;
* Dr. Amir Dehkhoda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subject Matter Expert (SME):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Chihiro Ohara&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Developers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Ahren Spadinger-Fengler&lt;br /&gt;
* Alex Day&lt;br /&gt;
* Dante Cerron&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EML Designers:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Hannes Soderstrom&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Maryann Kempthorne&lt;br /&gt;
* Phoebe Titus&lt;br /&gt;
* Avni Kant&lt;br /&gt;
* Saeed Dyanatkar&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Emerging_Media_Lab&amp;diff=903515</id>
		<title>Emerging Media Lab</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Emerging_Media_Lab&amp;diff=903515"/>
		<updated>2026-08-19T23:42:38Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{infobox Emerging Media Lab}}&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
The Emerging Media Lab (EML) is an experimental space where faculty, students, and staff from all disciplines collaborate with industry and community. Its mission is to evolve learning by creating tools and techniques using emerging media including Augmented, Mixed, and Virtual Reality.&lt;br /&gt;
&lt;br /&gt;
===About this wiki===&lt;br /&gt;
&lt;br /&gt;
This section of the UBC wiki complements our public-facing website and GitHub repositories. Here you can find information on how to download and build our projects, as well as general technical information available to anyone. For all other EML documentation, including operations and administration info, consult [[Documentation:EML Where to find it]].&lt;br /&gt;
&lt;br /&gt;
All EML members are welcome to contribute to this documentation. Find out more about how to contribute: [[Documentation:EML How to Contribute]]&lt;br /&gt;
&lt;br /&gt;
== What you can do at EML ==&lt;br /&gt;
&lt;br /&gt;
We work with staff, faculty, students, volunteers, and student workers. Here&#039;s a short list of some of the ways you can get involved with EML, or visit the [http://eml.ubc.ca Emerging Media Lab website] for more information.&lt;br /&gt;
&lt;br /&gt;
=== UBC Faculty ===&lt;br /&gt;
&lt;br /&gt;
* [https://eml.ubc.ca/call-for-proposals/ Propose a project]&lt;br /&gt;
* [https://eml.ubc.ca/book-a-visit/ Bring your class to EML]&lt;br /&gt;
* [https://eml.ubc.ca/course-support/ Integrate your course with EML]&lt;br /&gt;
&lt;br /&gt;
=== UBC Students ===&lt;br /&gt;
&lt;br /&gt;
* [https://eml.ubc.ca/contact-us/get-involved/ Work on an EML project as a volunteer or paid student worker]&lt;br /&gt;
* [https://eml.ubc.ca/emlx/ Join EMLx to work on your own project using EML resources]&lt;br /&gt;
* [https://eml.ubc.ca/contact-us/get-involved/ Run demos and represent EML at our drop-ins and events]&lt;br /&gt;
* [https://eml.ubc.ca/course-support/ Do your coursework, capstone project, or directed studies at EML]&lt;br /&gt;
* Find out more about [[EML Learning Outcomes]]&lt;br /&gt;
&lt;br /&gt;
=== Everyone at UBC ===&lt;br /&gt;
&lt;br /&gt;
* [https://eml.ubc.ca/drop-ins/ Connect with us to check out our projects, and try out emerging technologies like virtual and augmented reality]&lt;br /&gt;
* [https://eml.ubc.ca/book-a-visit/ Book a visit to EML]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://eml.ubc.ca/contact-us/ Contact us or stop by a drop in to find out more!]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== EML Code of Conduct ==&lt;br /&gt;
When visiting the Emerging Media Lab itself, working with EML, or participating in EML spaces online, you agree to the [[EML Code of Conduct]].&lt;br /&gt;
&lt;br /&gt;
== EML locations ==&lt;br /&gt;
EML has several lab spaces on the UBC Vancouver campus. Most meetings happen in the main development space in McGavin. [[https://eml.ubc.ca/drop-ins/ Public demos and drop-ins are held in Irving K. Barber Learning Centre]].&lt;br /&gt;
&lt;br /&gt;
Please note that not all locations are open to the public. [[https://eml.ubc.ca/book-a-visit/ Book a visit on our website.]]&lt;br /&gt;
&lt;br /&gt;
[https://eml.ubc.ca/locations/ Get directions and find out more about our locations.]&lt;br /&gt;
&lt;br /&gt;
== EML resources ==&lt;br /&gt;
We have a variety of equipment, tools, and know-how that you&#039;re welcome to use. Contact us for more information.&lt;br /&gt;
&lt;br /&gt;
==Current projects== &lt;br /&gt;
&lt;br /&gt;
Current projects documentation:&lt;br /&gt;
*26-1001 EPISODE (Enhanced Practice for Integrated Simulation of Drug-Related Encounters)&lt;br /&gt;
*[[Documentation:Immersive Education in Mining|25-3002 Immersive Education in Mining]]&lt;br /&gt;
*[[Documentation:26-1001 Vestibulearn: An Interactive XR Guide to Vestibular Anatomy|26-1001 Vestibulearn: MR BPPV Treatment]]&lt;br /&gt;
*[[24-3002 Procedural Poetry Funhouse|25-3001 Procedural Poetry Funhouse]]&lt;br /&gt;
*26-1001 ARCADE (Augmented Reality Community Authoring &amp;amp; Development)&lt;br /&gt;
*[[Documentation:26-1001 IMLE (Immersive Materials Learning Environment)|26-1001 IMLE (Immersive Materials Learning Environment)]]&lt;br /&gt;
&lt;br /&gt;
==Past projects==&lt;br /&gt;
We have worked on a variety of projects across UBC faculties and departments. [https://eml.ubc.ca/projects Learn more about them on our website&#039;s Projects page.]&lt;br /&gt;
*[[Documentation:25-1002 Virtual Soils|25-1002 Virtual Soils]]&lt;br /&gt;
*[[Documentation:24-1002 Augmented Reality Assisted Standard Operating Procedures (AR-A-SOP)|25-1002 Augmented Reality Assisted Standard Operating Procedures (AR-A-SOP)]]&lt;br /&gt;
*[[Documentation:23-1003 Nurse Practitioner|25-1003 Nurse Practitioner]]&lt;br /&gt;
*[[Documentation:24-1001 Enhanced Auditory Simulation Improved Map|24-1001 Enhanced Auditory Simulation Improved Map (EARSIM)]]&lt;br /&gt;
*[[24-3001 Head Spin: Multisensory Integration of 3D Orientation in VR]]&lt;br /&gt;
*[[24-3003 Online Course Enhanced Learning Intelligent Assistant (OCELIA)]]&lt;br /&gt;
*[[Documentation:23-3001 Judicial Interrogatory Simulator|23-1001 Judicial Interrogatory Simulator]]&lt;br /&gt;
*[[Documentation:23-1002 Behavioural Biomarker|23-1002 Behavioural Biomarker]]&lt;br /&gt;
*[[Documentation:23-1003 Nurse Practitioner|23-1003 Nurse Practitioner]] &lt;br /&gt;
*[[Documentation:23-1004 VR Makerspace|23-1004 Virtual Makerspace]]&lt;br /&gt;
*[[Documentation:23-3002 Tapestry Tool ML|23-3002 Tapestry Tool ML]]&lt;br /&gt;
*[[Documentation:23-3003 Vestibular Assessment|23-3003 Vestibular Assessment]]&lt;br /&gt;
*[[Documentation:23-3004 Shakespeare xR|23-3004 Shakespeare xR]]&lt;br /&gt;
*[[Documentation:Metabolism|19-3001 3D Metabolism]]&lt;br /&gt;
*[[3D Educational Resources]]&lt;br /&gt;
*[[Documentation:Moot Court|Moot Court]]&lt;br /&gt;
*[[Documentation:COGS 300|COGS 300 Labs]]&lt;br /&gt;
*[[Documentation:Pterygopalatine Fossa VR|Pterygopalatine Fossa VR]]&lt;br /&gt;
*[[Documentation:AAC Simulator|AAC Simulator]]&lt;br /&gt;
*[[Documentation:Radiology Diagnostic Trainer|Radiology Diagnostic Trainer]]&lt;br /&gt;
*[[Documentation:Gamifying Forestry|Gamifying Forestry]]&lt;br /&gt;
*[[Documentation:OER Geomatics|OER Geomatics]]&lt;br /&gt;
*[[Documentation:Geospatial Audio|Geospatial Audio]]&lt;br /&gt;
*[[Documentation:Taxidi_Ancient_City|Exploration of Ancient City]]&lt;br /&gt;
*[[Documentation:Holographic Brain Project|Holobrain]]&lt;br /&gt;
*[[Documentation:Soil_TopARgraphy|Soil TopARgraphy]]&lt;br /&gt;
*[[Documentation:Syrian Digital Storytelling Experience|Syrian Digital Storytelling Experience]]&lt;br /&gt;
*[[Documentation: UBC Time Machine|UBC Time Machine]]&lt;br /&gt;
*[[Documentation: Pain Box|Pain Box]]&lt;br /&gt;
*[[Documentation: Math World|Math World]]&lt;br /&gt;
*[[Documentation: Digital Glass|Digital Glass]]&lt;br /&gt;
*[[Documentation: Pocket Pelvis|Pocket Pelvis]]&lt;br /&gt;
*[[Documentation:Virtual Co-Locator|Virtual Co-Locator]]&lt;br /&gt;
*[[Documentation:VR in Pain Control|VR in Pain Control]]&lt;br /&gt;
*[[Documentation:MindCraft|MindCraft]]&lt;br /&gt;
*[[Documentation:Physics World|Physics World]]&lt;br /&gt;
*[[Documentation:Stanley Park Virtual Field Trip|Stanley Park Virtual Field Trip]]&lt;br /&gt;
*[[Documentation:Interactive Orchestra|Interactive Orchestra]]&lt;br /&gt;
*[[Documentation:AR Design|AR Design]]&lt;br /&gt;
*[[Documentation:Jupyter3D|Jupyter3D]]&lt;br /&gt;
*[[Documentation:Language Chatsim|Language Chatsim]]&lt;br /&gt;
*[[Documentation:ScholarsVR|ScholarsVR]]&lt;br /&gt;
*[[Interactive Animation Toolkit for Unity]]&lt;br /&gt;
*[[Documentation:Main Mall Hustle|Main Mall Hustle]]&lt;br /&gt;
*[[ECG Terrain]]&lt;br /&gt;
*[[Digital Play]]&lt;br /&gt;
*[[Documentation:EML Electrocardiogram (ECG) Project|ECG Classification]]&lt;br /&gt;
*[[Documentation:Socratic Dialogues|Socratic Dialogues]]&lt;br /&gt;
&lt;br /&gt;
==Technical documentation==&lt;br /&gt;
These are instructions for how to do some of what EML does. Looking for help or a place to work on your project? Contact us.&lt;br /&gt;
* [[Documentation:Unity&#039;s UI Toolkit Guide]]&lt;br /&gt;
*[https://docs.google.com/document/d/1UyUrTLm6t_5IHcvABwkONOL4VwfsBHHjzIQSE_bq-Vw/edit A Guide To Capturing and Preparing Photogrammetry For Unity]&lt;br /&gt;
*[[Documentation:ZBrush Optimization Workflow]]&lt;br /&gt;
*[[Documentation:Emerging Media Lab Tools]]&lt;br /&gt;
*[[Documentation:Maya Optimization Workflow]]&lt;br /&gt;
&lt;br /&gt;
==How to contact EML==&lt;br /&gt;
Please contact us via the [https://eml.ubc.ca/contact-us Contact page on our website.]&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Emerging Media Lab]] [[Category: EML]]&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903514</id>
		<title>Documentation:26-1001 IMLE (Immersive Materials Learning Environment)</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Documentation:26-1001_IMLE_(Immersive_Materials_Learning_Environment)&amp;diff=903514"/>
		<updated>2026-08-19T23:42:29Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: Created page with &amp;quot;IMLE PAGE&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;IMLE PAGE&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Emerging_Media_Lab&amp;diff=903513</id>
		<title>Emerging Media Lab</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Emerging_Media_Lab&amp;diff=903513"/>
		<updated>2026-08-19T23:40:24Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: /* Current projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{infobox Emerging Media Lab}}&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
The Emerging Media Lab (EML) is an experimental space where faculty, students, and staff from all disciplines collaborate with industry and community. Its mission is to evolve learning by creating tools and techniques using emerging media including Augmented, Mixed, and Virtual Reality.&lt;br /&gt;
&lt;br /&gt;
===About this wiki===&lt;br /&gt;
&lt;br /&gt;
This section of the UBC wiki complements our public-facing website and GitHub repositories. Here you can find information on how to download and build our projects, as well as general technical information available to anyone. For all other EML documentation, including operations and administration info, consult [[Documentation:EML Where to find it]].&lt;br /&gt;
&lt;br /&gt;
All EML members are welcome to contribute to this documentation. Find out more about how to contribute: [[Documentation:EML How to Contribute]]&lt;br /&gt;
&lt;br /&gt;
== What you can do at EML ==&lt;br /&gt;
&lt;br /&gt;
We work with staff, faculty, students, volunteers, and student workers. Here&#039;s a short list of some of the ways you can get involved with EML, or visit the [http://eml.ubc.ca Emerging Media Lab website] for more information.&lt;br /&gt;
&lt;br /&gt;
=== UBC Faculty ===&lt;br /&gt;
&lt;br /&gt;
* [https://eml.ubc.ca/call-for-proposals/ Propose a project]&lt;br /&gt;
* [https://eml.ubc.ca/book-a-visit/ Bring your class to EML]&lt;br /&gt;
* [https://eml.ubc.ca/course-support/ Integrate your course with EML]&lt;br /&gt;
&lt;br /&gt;
=== UBC Students ===&lt;br /&gt;
&lt;br /&gt;
* [https://eml.ubc.ca/contact-us/get-involved/ Work on an EML project as a volunteer or paid student worker]&lt;br /&gt;
* [https://eml.ubc.ca/emlx/ Join EMLx to work on your own project using EML resources]&lt;br /&gt;
* [https://eml.ubc.ca/contact-us/get-involved/ Run demos and represent EML at our drop-ins and events]&lt;br /&gt;
* [https://eml.ubc.ca/course-support/ Do your coursework, capstone project, or directed studies at EML]&lt;br /&gt;
* Find out more about [[EML Learning Outcomes]]&lt;br /&gt;
&lt;br /&gt;
=== Everyone at UBC ===&lt;br /&gt;
&lt;br /&gt;
* [https://eml.ubc.ca/drop-ins/ Connect with us to check out our projects, and try out emerging technologies like virtual and augmented reality]&lt;br /&gt;
* [https://eml.ubc.ca/book-a-visit/ Book a visit to EML]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://eml.ubc.ca/contact-us/ Contact us or stop by a drop in to find out more!]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== EML Code of Conduct ==&lt;br /&gt;
When visiting the Emerging Media Lab itself, working with EML, or participating in EML spaces online, you agree to the [[EML Code of Conduct]].&lt;br /&gt;
&lt;br /&gt;
== EML locations ==&lt;br /&gt;
EML has several lab spaces on the UBC Vancouver campus. Most meetings happen in the main development space in McGavin. [[https://eml.ubc.ca/drop-ins/ Public demos and drop-ins are held in Irving K. Barber Learning Centre]].&lt;br /&gt;
&lt;br /&gt;
Please note that not all locations are open to the public. [[https://eml.ubc.ca/book-a-visit/ Book a visit on our website.]]&lt;br /&gt;
&lt;br /&gt;
[https://eml.ubc.ca/locations/ Get directions and find out more about our locations.]&lt;br /&gt;
&lt;br /&gt;
== EML resources ==&lt;br /&gt;
We have a variety of equipment, tools, and know-how that you&#039;re welcome to use. Contact us for more information.&lt;br /&gt;
&lt;br /&gt;
==Current projects== &lt;br /&gt;
&lt;br /&gt;
Current projects documentation:&lt;br /&gt;
*26-1001 EPISODE (Enhanced Practice for Integrated Simulation of Drug-Related Encounters)&lt;br /&gt;
*[[Documentation:Immersive Education in Mining|25-3002 Immersive Education in Mining]]&lt;br /&gt;
*[[Documentation:26-1001 Vestibulearn: An Interactive XR Guide to Vestibular Anatomy|26-1001 Vestibulearn: MR BPPV Treatment]]&lt;br /&gt;
*[[24-3002 Procedural Poetry Funhouse|25-3001 Procedural Poetry Funhouse]]&lt;br /&gt;
*26-1001 ARCADE (Augmented Reality Community Authoring &amp;amp; Development)&lt;br /&gt;
*26-1001 IMLE (Immersive Materials Learning Environment)&lt;br /&gt;
&lt;br /&gt;
==Past projects==&lt;br /&gt;
We have worked on a variety of projects across UBC faculties and departments. [https://eml.ubc.ca/projects Learn more about them on our website&#039;s Projects page.]&lt;br /&gt;
*[[Documentation:25-1002 Virtual Soils|25-1002 Virtual Soils]]&lt;br /&gt;
*[[Documentation:24-1002 Augmented Reality Assisted Standard Operating Procedures (AR-A-SOP)|25-1002 Augmented Reality Assisted Standard Operating Procedures (AR-A-SOP)]]&lt;br /&gt;
*[[Documentation:23-1003 Nurse Practitioner|25-1003 Nurse Practitioner]]&lt;br /&gt;
*[[Documentation:24-1001 Enhanced Auditory Simulation Improved Map|24-1001 Enhanced Auditory Simulation Improved Map (EARSIM)]]&lt;br /&gt;
*[[24-3001 Head Spin: Multisensory Integration of 3D Orientation in VR]]&lt;br /&gt;
*[[24-3003 Online Course Enhanced Learning Intelligent Assistant (OCELIA)]]&lt;br /&gt;
*[[Documentation:23-3001 Judicial Interrogatory Simulator|23-1001 Judicial Interrogatory Simulator]]&lt;br /&gt;
*[[Documentation:23-1002 Behavioural Biomarker|23-1002 Behavioural Biomarker]]&lt;br /&gt;
*[[Documentation:23-1003 Nurse Practitioner|23-1003 Nurse Practitioner]] &lt;br /&gt;
*[[Documentation:23-1004 VR Makerspace|23-1004 Virtual Makerspace]]&lt;br /&gt;
*[[Documentation:23-3002 Tapestry Tool ML|23-3002 Tapestry Tool ML]]&lt;br /&gt;
*[[Documentation:23-3003 Vestibular Assessment|23-3003 Vestibular Assessment]]&lt;br /&gt;
*[[Documentation:23-3004 Shakespeare xR|23-3004 Shakespeare xR]]&lt;br /&gt;
*[[Documentation:Metabolism|19-3001 3D Metabolism]]&lt;br /&gt;
*[[3D Educational Resources]]&lt;br /&gt;
*[[Documentation:Moot Court|Moot Court]]&lt;br /&gt;
*[[Documentation:COGS 300|COGS 300 Labs]]&lt;br /&gt;
*[[Documentation:Pterygopalatine Fossa VR|Pterygopalatine Fossa VR]]&lt;br /&gt;
*[[Documentation:AAC Simulator|AAC Simulator]]&lt;br /&gt;
*[[Documentation:Radiology Diagnostic Trainer|Radiology Diagnostic Trainer]]&lt;br /&gt;
*[[Documentation:Gamifying Forestry|Gamifying Forestry]]&lt;br /&gt;
*[[Documentation:OER Geomatics|OER Geomatics]]&lt;br /&gt;
*[[Documentation:Geospatial Audio|Geospatial Audio]]&lt;br /&gt;
*[[Documentation:Taxidi_Ancient_City|Exploration of Ancient City]]&lt;br /&gt;
*[[Documentation:Holographic Brain Project|Holobrain]]&lt;br /&gt;
*[[Documentation:Soil_TopARgraphy|Soil TopARgraphy]]&lt;br /&gt;
*[[Documentation:Syrian Digital Storytelling Experience|Syrian Digital Storytelling Experience]]&lt;br /&gt;
*[[Documentation: UBC Time Machine|UBC Time Machine]]&lt;br /&gt;
*[[Documentation: Pain Box|Pain Box]]&lt;br /&gt;
*[[Documentation: Math World|Math World]]&lt;br /&gt;
*[[Documentation: Digital Glass|Digital Glass]]&lt;br /&gt;
*[[Documentation: Pocket Pelvis|Pocket Pelvis]]&lt;br /&gt;
*[[Documentation:Virtual Co-Locator|Virtual Co-Locator]]&lt;br /&gt;
*[[Documentation:VR in Pain Control|VR in Pain Control]]&lt;br /&gt;
*[[Documentation:MindCraft|MindCraft]]&lt;br /&gt;
*[[Documentation:Physics World|Physics World]]&lt;br /&gt;
*[[Documentation:Stanley Park Virtual Field Trip|Stanley Park Virtual Field Trip]]&lt;br /&gt;
*[[Documentation:Interactive Orchestra|Interactive Orchestra]]&lt;br /&gt;
*[[Documentation:AR Design|AR Design]]&lt;br /&gt;
*[[Documentation:Jupyter3D|Jupyter3D]]&lt;br /&gt;
*[[Documentation:Language Chatsim|Language Chatsim]]&lt;br /&gt;
*[[Documentation:ScholarsVR|ScholarsVR]]&lt;br /&gt;
*[[Interactive Animation Toolkit for Unity]]&lt;br /&gt;
*[[Documentation:Main Mall Hustle|Main Mall Hustle]]&lt;br /&gt;
*[[ECG Terrain]]&lt;br /&gt;
*[[Digital Play]]&lt;br /&gt;
*[[Documentation:EML Electrocardiogram (ECG) Project|ECG Classification]]&lt;br /&gt;
*[[Documentation:Socratic Dialogues|Socratic Dialogues]]&lt;br /&gt;
&lt;br /&gt;
==Technical documentation==&lt;br /&gt;
These are instructions for how to do some of what EML does. Looking for help or a place to work on your project? Contact us.&lt;br /&gt;
* [[Documentation:Unity&#039;s UI Toolkit Guide]]&lt;br /&gt;
*[https://docs.google.com/document/d/1UyUrTLm6t_5IHcvABwkONOL4VwfsBHHjzIQSE_bq-Vw/edit A Guide To Capturing and Preparing Photogrammetry For Unity]&lt;br /&gt;
*[[Documentation:ZBrush Optimization Workflow]]&lt;br /&gt;
*[[Documentation:Emerging Media Lab Tools]]&lt;br /&gt;
*[[Documentation:Maya Optimization Workflow]]&lt;br /&gt;
&lt;br /&gt;
==How to contact EML==&lt;br /&gt;
Please contact us via the [https://eml.ubc.ca/contact-us Contact page on our website.]&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Emerging Media Lab]] [[Category: EML]]&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
	<entry>
		<id>https://wiki.ubc.ca/index.php?title=Emerging_Media_Lab&amp;diff=903512</id>
		<title>Emerging Media Lab</title>
		<link rel="alternate" type="text/html" href="https://wiki.ubc.ca/index.php?title=Emerging_Media_Lab&amp;diff=903512"/>
		<updated>2026-08-19T23:39:28Z</updated>

		<summary type="html">&lt;p&gt;HannesSoderstrom: fixed a mislabeled link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{infobox Emerging Media Lab}}&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
The Emerging Media Lab (EML) is an experimental space where faculty, students, and staff from all disciplines collaborate with industry and community. Its mission is to evolve learning by creating tools and techniques using emerging media including Augmented, Mixed, and Virtual Reality.&lt;br /&gt;
&lt;br /&gt;
===About this wiki===&lt;br /&gt;
&lt;br /&gt;
This section of the UBC wiki complements our public-facing website and GitHub repositories. Here you can find information on how to download and build our projects, as well as general technical information available to anyone. For all other EML documentation, including operations and administration info, consult [[Documentation:EML Where to find it]].&lt;br /&gt;
&lt;br /&gt;
All EML members are welcome to contribute to this documentation. Find out more about how to contribute: [[Documentation:EML How to Contribute]]&lt;br /&gt;
&lt;br /&gt;
== What you can do at EML ==&lt;br /&gt;
&lt;br /&gt;
We work with staff, faculty, students, volunteers, and student workers. Here&#039;s a short list of some of the ways you can get involved with EML, or visit the [http://eml.ubc.ca Emerging Media Lab website] for more information.&lt;br /&gt;
&lt;br /&gt;
=== UBC Faculty ===&lt;br /&gt;
&lt;br /&gt;
* [https://eml.ubc.ca/call-for-proposals/ Propose a project]&lt;br /&gt;
* [https://eml.ubc.ca/book-a-visit/ Bring your class to EML]&lt;br /&gt;
* [https://eml.ubc.ca/course-support/ Integrate your course with EML]&lt;br /&gt;
&lt;br /&gt;
=== UBC Students ===&lt;br /&gt;
&lt;br /&gt;
* [https://eml.ubc.ca/contact-us/get-involved/ Work on an EML project as a volunteer or paid student worker]&lt;br /&gt;
* [https://eml.ubc.ca/emlx/ Join EMLx to work on your own project using EML resources]&lt;br /&gt;
* [https://eml.ubc.ca/contact-us/get-involved/ Run demos and represent EML at our drop-ins and events]&lt;br /&gt;
* [https://eml.ubc.ca/course-support/ Do your coursework, capstone project, or directed studies at EML]&lt;br /&gt;
* Find out more about [[EML Learning Outcomes]]&lt;br /&gt;
&lt;br /&gt;
=== Everyone at UBC ===&lt;br /&gt;
&lt;br /&gt;
* [https://eml.ubc.ca/drop-ins/ Connect with us to check out our projects, and try out emerging technologies like virtual and augmented reality]&lt;br /&gt;
* [https://eml.ubc.ca/book-a-visit/ Book a visit to EML]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://eml.ubc.ca/contact-us/ Contact us or stop by a drop in to find out more!]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== EML Code of Conduct ==&lt;br /&gt;
When visiting the Emerging Media Lab itself, working with EML, or participating in EML spaces online, you agree to the [[EML Code of Conduct]].&lt;br /&gt;
&lt;br /&gt;
== EML locations ==&lt;br /&gt;
EML has several lab spaces on the UBC Vancouver campus. Most meetings happen in the main development space in McGavin. [[https://eml.ubc.ca/drop-ins/ Public demos and drop-ins are held in Irving K. Barber Learning Centre]].&lt;br /&gt;
&lt;br /&gt;
Please note that not all locations are open to the public. [[https://eml.ubc.ca/book-a-visit/ Book a visit on our website.]]&lt;br /&gt;
&lt;br /&gt;
[https://eml.ubc.ca/locations/ Get directions and find out more about our locations.]&lt;br /&gt;
&lt;br /&gt;
== EML resources ==&lt;br /&gt;
We have a variety of equipment, tools, and know-how that you&#039;re welcome to use. Contact us for more information.&lt;br /&gt;
&lt;br /&gt;
==Current projects== &lt;br /&gt;
&lt;br /&gt;
Current projects documentation:&lt;br /&gt;
*26-1001 EPISODE (Enhanced Practice for Integrated Simulation of Drug-Related Encounters)&lt;br /&gt;
*[[Documentation:Immersive Education in Mining|25-3002 Immersive Education in Mining]]&lt;br /&gt;
*[[Documentation:26-1001 Vestibulearn: An Interactive XR Guide to Vestibular Anatomy|26-1001 Vestibulearn: MR BPPV Treatment]]&lt;br /&gt;
*[[24-3002 Procedural Poetry Funhouse|25-3001 Procedural Poetry Funhouse]]&lt;br /&gt;
*26-1001 ARCADE (Augmented Reality Community Authoring &amp;amp; Development)&lt;br /&gt;
&lt;br /&gt;
==Past projects==&lt;br /&gt;
We have worked on a variety of projects across UBC faculties and departments. [https://eml.ubc.ca/projects Learn more about them on our website&#039;s Projects page.]&lt;br /&gt;
*[[Documentation:25-1002 Virtual Soils|25-1002 Virtual Soils]]&lt;br /&gt;
*[[Documentation:24-1002 Augmented Reality Assisted Standard Operating Procedures (AR-A-SOP)|25-1002 Augmented Reality Assisted Standard Operating Procedures (AR-A-SOP)]]&lt;br /&gt;
*[[Documentation:23-1003 Nurse Practitioner|25-1003 Nurse Practitioner]]&lt;br /&gt;
*[[Documentation:24-1001 Enhanced Auditory Simulation Improved Map|24-1001 Enhanced Auditory Simulation Improved Map (EARSIM)]]&lt;br /&gt;
*[[24-3001 Head Spin: Multisensory Integration of 3D Orientation in VR]]&lt;br /&gt;
*[[24-3003 Online Course Enhanced Learning Intelligent Assistant (OCELIA)]]&lt;br /&gt;
*[[Documentation:23-3001 Judicial Interrogatory Simulator|23-1001 Judicial Interrogatory Simulator]]&lt;br /&gt;
*[[Documentation:23-1002 Behavioural Biomarker|23-1002 Behavioural Biomarker]]&lt;br /&gt;
*[[Documentation:23-1003 Nurse Practitioner|23-1003 Nurse Practitioner]] &lt;br /&gt;
*[[Documentation:23-1004 VR Makerspace|23-1004 Virtual Makerspace]]&lt;br /&gt;
*[[Documentation:23-3002 Tapestry Tool ML|23-3002 Tapestry Tool ML]]&lt;br /&gt;
*[[Documentation:23-3003 Vestibular Assessment|23-3003 Vestibular Assessment]]&lt;br /&gt;
*[[Documentation:23-3004 Shakespeare xR|23-3004 Shakespeare xR]]&lt;br /&gt;
*[[Documentation:Metabolism|19-3001 3D Metabolism]]&lt;br /&gt;
*[[3D Educational Resources]]&lt;br /&gt;
*[[Documentation:Moot Court|Moot Court]]&lt;br /&gt;
*[[Documentation:COGS 300|COGS 300 Labs]]&lt;br /&gt;
*[[Documentation:Pterygopalatine Fossa VR|Pterygopalatine Fossa VR]]&lt;br /&gt;
*[[Documentation:AAC Simulator|AAC Simulator]]&lt;br /&gt;
*[[Documentation:Radiology Diagnostic Trainer|Radiology Diagnostic Trainer]]&lt;br /&gt;
*[[Documentation:Gamifying Forestry|Gamifying Forestry]]&lt;br /&gt;
*[[Documentation:OER Geomatics|OER Geomatics]]&lt;br /&gt;
*[[Documentation:Geospatial Audio|Geospatial Audio]]&lt;br /&gt;
*[[Documentation:Taxidi_Ancient_City|Exploration of Ancient City]]&lt;br /&gt;
*[[Documentation:Holographic Brain Project|Holobrain]]&lt;br /&gt;
*[[Documentation:Soil_TopARgraphy|Soil TopARgraphy]]&lt;br /&gt;
*[[Documentation:Syrian Digital Storytelling Experience|Syrian Digital Storytelling Experience]]&lt;br /&gt;
*[[Documentation: UBC Time Machine|UBC Time Machine]]&lt;br /&gt;
*[[Documentation: Pain Box|Pain Box]]&lt;br /&gt;
*[[Documentation: Math World|Math World]]&lt;br /&gt;
*[[Documentation: Digital Glass|Digital Glass]]&lt;br /&gt;
*[[Documentation: Pocket Pelvis|Pocket Pelvis]]&lt;br /&gt;
*[[Documentation:Virtual Co-Locator|Virtual Co-Locator]]&lt;br /&gt;
*[[Documentation:VR in Pain Control|VR in Pain Control]]&lt;br /&gt;
*[[Documentation:MindCraft|MindCraft]]&lt;br /&gt;
*[[Documentation:Physics World|Physics World]]&lt;br /&gt;
*[[Documentation:Stanley Park Virtual Field Trip|Stanley Park Virtual Field Trip]]&lt;br /&gt;
*[[Documentation:Interactive Orchestra|Interactive Orchestra]]&lt;br /&gt;
*[[Documentation:AR Design|AR Design]]&lt;br /&gt;
*[[Documentation:Jupyter3D|Jupyter3D]]&lt;br /&gt;
*[[Documentation:Language Chatsim|Language Chatsim]]&lt;br /&gt;
*[[Documentation:ScholarsVR|ScholarsVR]]&lt;br /&gt;
*[[Interactive Animation Toolkit for Unity]]&lt;br /&gt;
*[[Documentation:Main Mall Hustle|Main Mall Hustle]]&lt;br /&gt;
*[[ECG Terrain]]&lt;br /&gt;
*[[Digital Play]]&lt;br /&gt;
*[[Documentation:EML Electrocardiogram (ECG) Project|ECG Classification]]&lt;br /&gt;
*[[Documentation:Socratic Dialogues|Socratic Dialogues]]&lt;br /&gt;
&lt;br /&gt;
==Technical documentation==&lt;br /&gt;
These are instructions for how to do some of what EML does. Looking for help or a place to work on your project? Contact us.&lt;br /&gt;
* [[Documentation:Unity&#039;s UI Toolkit Guide]]&lt;br /&gt;
*[https://docs.google.com/document/d/1UyUrTLm6t_5IHcvABwkONOL4VwfsBHHjzIQSE_bq-Vw/edit A Guide To Capturing and Preparing Photogrammetry For Unity]&lt;br /&gt;
*[[Documentation:ZBrush Optimization Workflow]]&lt;br /&gt;
*[[Documentation:Emerging Media Lab Tools]]&lt;br /&gt;
*[[Documentation:Maya Optimization Workflow]]&lt;br /&gt;
&lt;br /&gt;
==How to contact EML==&lt;br /&gt;
Please contact us via the [https://eml.ubc.ca/contact-us Contact page on our website.]&lt;br /&gt;
&lt;br /&gt;
== EML Documentation License ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Emerging Media Lab]] [[Category: EML]]&lt;/div&gt;</summary>
		<author><name>HannesSoderstrom</name></author>
	</entry>
</feed>