@@ -358,6 +358,112 @@ export function createPond(scene, gradientMap) { |
| 358 | | 358 | |
| 359 | group.add(village) | 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 | // TREES - scattered around the edges | 468 | // TREES - scattered around the edges |
| 363 | // ============================================ | 469 | // ============================================ |