diff --git a/src/components/Scene.jsx b/src/components/Scene.jsx
index 4ce5766..79b66b6 100644
--- a/src/components/Scene.jsx
+++ b/src/components/Scene.jsx
@@ -1,6 +1,6 @@
import React, { useEffect, useState, useRef, forwardRef, useMemo } from "react";
import { Shadow, Brick } from ".";
-import { Vector3 } from "three";
+import { Vector3, Box3 } from "three";
import { uID, getMeasurementsFromDimensions, base } from "../utils";
import { useControls } from "leva";
@@ -85,15 +85,54 @@ export const Scene = () => {
const addBrick = (e) => {
e.stopPropagation();
- if (!isDrag.current) {
- const brickData = {
- intersect: { point: e.point, face: e.face },
- uID: uID(),
- dimensions: { x: width, z: length },
- rotation: rotate ? Math.PI / 2 : 0,
- };
+ if (!brickCursorRef.current) return;
- setBricks((prevState) => [...prevState, brickData]);
+ if (!isDrag.current) {
+ const dimensions = getMeasurementsFromDimensions({
+ x: width,
+ z: length,
+ });
+ const boundingBoxOfBrickToBeAdded = new Box3().setFromObject(
+ brickCursorRef.current
+ );
+
+ let canCreate = true;
+
+ for (let index = 0; index < bricksBoundBox.current.length; index++) {
+ const brickBoundingBox = bricksBoundBox.current[index].brickBoundingBox;
+ const collision =
+ boundingBoxOfBrickToBeAdded.intersectsBox(brickBoundingBox);
+
+ if (collision) {
+ const dx = Math.abs(
+ brickBoundingBox.max.x - boundingBoxOfBrickToBeAdded.max.x
+ );
+ const dz = Math.abs(
+ brickBoundingBox.max.z - boundingBoxOfBrickToBeAdded.max.z
+ );
+ const yIntsersect =
+ brickBoundingBox.max.y - 9 > boundingBoxOfBrickToBeAdded.min.y;
+ if (
+ yIntsersect &&
+ dx !== dimensions.width &&
+ dz !== dimensions.depth
+ ) {
+ canCreate = false;
+ break;
+ }
+ }
+ }
+
+ if (canCreate) {
+ const brickData = {
+ intersect: { point: e.point, face: e.face },
+ uID: uID(),
+ dimensions: { x: width, z: length },
+ rotation: rotate ? Math.PI / 2 : 0,
+ };
+
+ setBricks((prevState) => [...prevState, brickData]);
+ }
} else {
isDrag.current = false;
}
@@ -111,8 +150,6 @@ export const Scene = () => {
const evenWidth = rotate === 0 ? width % 2 === 0 : length % 2 === 0;
const evenDepth = rotate === 0 ? length % 2 === 0 : width % 2 === 0;
- console.log(e.face.normal, e.point);
-
brickCursorRef.current.position
.copy(new Vector3(e.point.x, Math.abs(e.point.y), e.point.z))
.add(
@@ -141,7 +178,7 @@ export const Scene = () => {
t && clearTimeout(t);
t = setTimeout(() => {
isDrag.current = true;
- }, 100);
+ }, 300);
};
const up = () => {
@@ -207,7 +244,7 @@ export const Scene = () => {
-
+
>
);
};