diff --git a/index.html b/index.html
index 12a5549..0acfb66 100644
--- a/index.html
+++ b/index.html
@@ -2101,19 +2101,48 @@ function collideTwoElements(elementA, elementB, compatible=true){ // dropping b
dir.subVectors( a, b ).normalize()
if (!compatible){
elementB.object3D.position.add( dir.multiplyScalar(-1)) // repulsive
+ // should be clamped, e.g maximum .1 unit bouncing
} else {
elementB.object3D.position.copy( a )
vol.setFromObject( elA.object3D )
- elementB.object3D.position.x += (vol.max.x - vol.min.x) // snapping equivalent
+ let width = (vol.max.x - vol.min.x)
+ // should check first is unoccopied, otherwise move further until empty
+ elementB.object3D.position.x += width // snapping equivalent
// then can also test for larger structures
// e.g H2O chain "../content/WaterBottle.glb" // by sirkitree (CC-BY)
+ // can rely on getClosestTargetElement() with the before/after position
+ // by default .05 threshold
+ let presentAtoms = {H:0, O:0, C:0}
+ presentAtoms[ elementA.getAttribute("value") ]++
+ presentAtoms[ elementB.getAttribute("value") ]++
+ let before = a.clone()
+ before.x -= width
+ let after = a.clone()
+ after.x += width*2 // one of them is a duplicate... might be already positioned correctly before?
+ presentAtoms[ getClosestTargetElement( before ).getAttribute("value") ]++
+ presentAtoms[ getClosestTargetElement( after ).getAttribute("value") ]++
+ const compoundChemistryExamples = [ {atoms:{H:2, O:1, C:0},name:"water",url_model:"../content/WaterBottle.glb"} ]
+ console.log( presentAtoms, compoundChemistryExamples[0] )
+ compoundChemistryExamples.map( x => {
+ console.log("comparing", x.atoms, presentAtoms)
+ if (
+
+ Object.keys(x.atoms).map( k => x.atoms[k] <= presentAtoms[k] ) // simplified, should be exact match
+ .reduce( (a,b) => (a&&b) )
+ ){
+ console.log( x.name, "found", x.url_model,"to display")
+ addGltfFromURLAsTarget( x.url_model, .1 )
+ }
+ })
}
}
/* testing
-elA = addBlockCodeExample('O', '-0.2 1.4 -0.2')
-elB = addBlockCodeExample('H') // need few milliseconds to create before testing, so no copy/paste
-collideTwoElements(elA, elB)
-collideTwoElements(elA, elB, false)
+
+elA = addBlockCodeExample('O', '-0.2 1.4 -0.2'); elB = addBlockCodeExample('H'); elC = addBlockCodeExample('H', '0.2 1.4 -0.2')
+collideTwoElements(elA, elB); collideTwoElements(elB, elC);
+
+add a new component to see if a group has been modified
+ means creating first an entity to receive that component and as children the other entities
*/
function addBlockCodeExample(text="hi", pos="0 1.4 -0.2", color="black", outlineColor="white"){