@@ -358,6 +358,112 @@ export function createPond(scene, gradientMap) { |
| 358 | 358 | |
| 359 | 359 | group.add(village) |
| 360 | 360 | |
| 361 | + // ============================================ |
| 362 | + // BOATHOUSE - cozy little structure at pond corner |
| 363 | + // ============================================ |
| 364 | + |
| 365 | + const boathouse = new THREE.Group() |
| 366 | + const boathouseX = -4.2 |
| 367 | + const boathouseZ = 3.2 |
| 368 | + |
| 369 | + // Boathouse materials |
| 370 | + const boathouseWoodMaterial = new THREE.MeshToonMaterial({ |
| 371 | + color: 0x8b6914, // Weathered wood |
| 372 | + gradientMap: gradientMap |
| 373 | + }) |
| 374 | + const boathouseRoofMaterial = new THREE.MeshToonMaterial({ |
| 375 | + color: 0x5a4a3a, // Dark wood/slate roof |
| 376 | + gradientMap: gradientMap |
| 377 | + }) |
| 378 | + const boathouseTrimMaterial = new THREE.MeshToonMaterial({ |
| 379 | + color: 0x6b5030, // Darker trim |
| 380 | + gradientMap: gradientMap |
| 381 | + }) |
| 382 | + |
| 383 | + // Main building - slightly larger than houses to dwarf Doug |
| 384 | + const boathouseBodyGeom = new THREE.BoxGeometry(1.2, 0.9, 1.0) |
| 385 | + const boathouseBody = new THREE.Mesh(boathouseBodyGeom, boathouseWoodMaterial) |
| 386 | + boathouseBody.position.set(0, 0.45, 0) |
| 387 | + boathouse.add(boathouseBody) |
| 388 | + |
| 389 | + // Roof - pitched roof |
| 390 | + const roofShape = new THREE.Shape() |
| 391 | + roofShape.moveTo(-0.75, 0) |
| 392 | + roofShape.lineTo(0, 0.5) |
| 393 | + roofShape.lineTo(0.75, 0) |
| 394 | + roofShape.lineTo(-0.75, 0) |
| 395 | + |
| 396 | + const roofExtrudeSettings = { depth: 1.15, bevelEnabled: false } |
| 397 | + const boathouseRoofGeom = new THREE.ExtrudeGeometry(roofShape, roofExtrudeSettings) |
| 398 | + const boathouseRoof = new THREE.Mesh(boathouseRoofGeom, boathouseRoofMaterial) |
| 399 | + boathouseRoof.position.set(0, 0.9, -0.575) |
| 400 | + boathouse.add(boathouseRoof) |
| 401 | + |
| 402 | + // Roof overhang trim |
| 403 | + const overhangGeom = new THREE.BoxGeometry(1.5, 0.05, 0.08) |
| 404 | + const overhangFront = new THREE.Mesh(overhangGeom, boathouseTrimMaterial) |
| 405 | + overhangFront.position.set(0, 0.92, 0.54) |
| 406 | + boathouse.add(overhangFront) |
| 407 | + const overhangBack = new THREE.Mesh(overhangGeom, boathouseTrimMaterial) |
| 408 | + overhangBack.position.set(0, 0.92, -0.54) |
| 409 | + boathouse.add(overhangBack) |
| 410 | + |
| 411 | + // Door opening (dark rectangle facing pond) |
| 412 | + const doorGeom = new THREE.PlaneGeometry(0.45, 0.6) |
| 413 | + const doorMaterial = new THREE.MeshToonMaterial({ |
| 414 | + color: 0x1a1a1a, |
| 415 | + gradientMap: gradientMap |
| 416 | + }) |
| 417 | + const door = new THREE.Mesh(doorGeom, doorMaterial) |
| 418 | + door.position.set(0.601, 0.35, 0.15) |
| 419 | + door.rotation.y = Math.PI / 2 |
| 420 | + boathouse.add(door) |
| 421 | + |
| 422 | + // Window on side |
| 423 | + const boathouseWindowGeom = new THREE.PlaneGeometry(0.25, 0.2) |
| 424 | + const boathouseWindowMaterial = new THREE.MeshToonMaterial({ |
| 425 | + color: 0x6b9bc3, |
| 426 | + gradientMap: gradientMap |
| 427 | + }) |
| 428 | + const boathouseWindow = new THREE.Mesh(boathouseWindowGeom, boathouseWindowMaterial) |
| 429 | + boathouseWindow.position.set(0, 0.55, 0.51) |
| 430 | + boathouse.add(boathouseWindow) |
| 431 | + |
| 432 | + // Window frame |
| 433 | + const frameH = new THREE.Mesh( |
| 434 | + new THREE.BoxGeometry(0.3, 0.02, 0.02), |
| 435 | + boathouseTrimMaterial |
| 436 | + ) |
| 437 | + frameH.position.set(0, 0.55, 0.52) |
| 438 | + boathouse.add(frameH) |
| 439 | + const frameV = new THREE.Mesh( |
| 440 | + new THREE.BoxGeometry(0.02, 0.25, 0.02), |
| 441 | + boathouseTrimMaterial |
| 442 | + ) |
| 443 | + frameV.position.set(0, 0.55, 0.52) |
| 444 | + boathouse.add(frameV) |
| 445 | + |
| 446 | + // Dock/platform extending toward pond |
| 447 | + const dockGeom = new THREE.BoxGeometry(1.0, 0.08, 0.6) |
| 448 | + const dock = new THREE.Mesh(dockGeom, boathouseWoodMaterial) |
| 449 | + dock.position.set(1.1, 0.04, 0.15) |
| 450 | + boathouse.add(dock) |
| 451 | + |
| 452 | + // Dock support posts |
| 453 | + const dockPostGeom = new THREE.CylinderGeometry(0.04, 0.05, 0.3, 6) |
| 454 | + const dockPost1 = new THREE.Mesh(dockPostGeom, boathouseTrimMaterial) |
| 455 | + dockPost1.position.set(1.5, -0.1, 0.35) |
| 456 | + boathouse.add(dockPost1) |
| 457 | + const dockPost2 = new THREE.Mesh(dockPostGeom, boathouseTrimMaterial) |
| 458 | + dockPost2.position.set(1.5, -0.1, -0.05) |
| 459 | + boathouse.add(dockPost2) |
| 460 | + |
| 461 | + // Position boathouse at corner, angled toward pond |
| 462 | + boathouse.position.set(boathouseX, 0, boathouseZ) |
| 463 | + boathouse.rotation.y = Math.PI / 4 + 0.3 // Angled toward pond center |
| 464 | + |
| 465 | + group.add(boathouse) |
| 466 | + |
| 361 | 467 | // ============================================ |
| 362 | 468 | // TREES - scattered around the edges |
| 363 | 469 | // ============================================ |