Skip to content

Commit 88d7f4a

Browse files
committed
reduce redundant code
1 parent 8663320 commit 88d7f4a

File tree

5 files changed

+36
-33
lines changed

5 files changed

+36
-33
lines changed

src/Entity/PlayerLocalController.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class PlayerLocalController extends EntityController {
7979
pm.addEventListener("pause=>play", this["pause=>play"]);
8080
pm.addEventListener("play=>pause", this["play=>pause"]);
8181
};
82+
// 转换成键盘消息 复用键盘的处理逻辑
8283
setMoveBtns(moveBtns = null) {
8384
if (this.moveBtns) {
8485
for (let btn of "up,left,down,right,jump,upleft,upright,flyup,flydown,fly,sneak".split(",")) {
@@ -133,6 +134,17 @@ class PlayerLocalController extends EntityController {
133134
if (type in this) this[type](event);
134135
this.dispatchEvent(type, event);
135136
};
137+
getHitting(bType = Block.renderType.NORMAL) {
138+
let entity = this.entity,
139+
world = entity.world,
140+
start = entity.getEyePosition(),
141+
end = entity.getDirection(20);
142+
vec3.add(start, end, end);
143+
return world.rayTraceBlock(start, end, (x, y, z) => {
144+
let b = world.getBlock(x, y, z);
145+
return b && b.name !== "air" && b.renderType === bType;
146+
});
147+
};
136148
_setEntityPitchAndYaw(movementX, movementY) {
137149
let i = this.mousemoveSensitivity * (Math.PI / 180);
138150
// movementX left- right+ movementY up- down+
@@ -159,15 +171,7 @@ class PlayerLocalController extends EntityController {
159171
if (e.button === 0) this.mouseRightBtnDown = true;
160172
if (e.button === 2) this.mouseLeftBtnDown = true;
161173
const destroyOrPlaceBlock = () => {
162-
let entity = this.entity,
163-
world = entity.world,
164-
start = entity.getEyePosition(),
165-
end = entity.getDirection(20);
166-
vec3.add(start, end, end);
167-
let hit = world.rayTraceBlock(start, end, (x, y, z) => {
168-
let b = world.getBlock(x, y, z);
169-
return b && b.name !== "air";
170-
});
174+
const world = this.entity.world, hit = this.getHitting();
171175
if (hit === null || hit.axis === "") return;
172176
let pos = hit.blockPos;
173177
if (this.mouseLeftBtnDown) {

src/Renderer/HighlightSelectedBlock.js

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import { Block } from "../World/Block.js";
22
import { vec3, mat4 } from "../utils/gmath.js";
3+
import * as glsl from "./glsl.js";
34

45
class HighlightSelectedBlock {
56
constructor(world, renderer = world.renderer) {
67
this.world = world;
7-
this.renderer = renderer;
88
this.mvp = mat4.identity();
9-
const {ctx} = renderer;
9+
this.setRenderer(renderer);
10+
};
11+
#calcMesh() {
12+
const {renderer} = this, {ctx} = this.renderer;
1013
this.meshs = new Map();
1114
for (let renderType of Object.values(Block.renderType)) {
1215
let isFluid = renderType === Block.renderType.FLUID;
@@ -42,16 +45,18 @@ class HighlightSelectedBlock {
4245
});
4346
}
4447
};
48+
setRenderer(renderer = null) {
49+
if (!renderer) return;
50+
// to free buffer
51+
if (this.renderer) this.dispose();
52+
this.renderer = renderer;
53+
renderer.createProgram("selector", glsl.selector.vert, glsl.selector.frag);
54+
this.#calcMesh();
55+
};
4556
draw() {
4657
const {world} = this, {mainPlayer} = world;
4758
if (mainPlayer.camera === null) return;
48-
let start = mainPlayer.getEyePosition(),
49-
end = mainPlayer.getDirection(20);
50-
vec3.add(start, end, end);
51-
let hit = world.rayTraceBlock(start, end, (x, y, z) => {
52-
let b = world.getBlock(x, y, z);
53-
return b && b.name !== "air";
54-
});
59+
const hit = mainPlayer.controller.getHitting?.() ?? null;
5560
if (hit === null) return;
5661

5762
const {renderer} = this, {ctx} = renderer;

src/Renderer/WorldChunkModule.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// 计算顶点,材质坐标,下标
1+
// 负责计算顶点,材质坐标,以及区块的绘制工作
22
import { Block } from "../World/Block.js";
33
import {
44
Chunk,
@@ -7,6 +7,7 @@ import {
77
CHUNK_Z_SIZE as Z_SIZE,
88
} from "../World/Chunk.js";
99
import { manhattanDis } from "../utils/gmath.js";
10+
import * as glsl from "./glsl.js";
1011

1112
const rxyz2int = Chunk.getLinearBlockIndex;
1213

@@ -58,6 +59,12 @@ class ChunksModule {
5859
setRenderer(renderer = null) {
5960
if (!renderer) return;
6061
this.renderer = renderer;
62+
if (renderer.isWebGL2)
63+
renderer.createProgram("showBlock", glsl.showBlock_webgl2.vert, glsl.showBlock_webgl2.frag)
64+
.use().bindTex("blockTex", renderer.createTextureArray(Block.defaultBlockTextureImg));
65+
else
66+
renderer.createProgram("showBlock", glsl.showBlock.vert, glsl.showBlock.frag)
67+
.use().bindTex("blockTex", renderer.createTexture(Block.defaultBlockTextureImg));
6168
this.updateMeshs();
6269
};
6370
buildChunkModule(chunkKey) {

src/Renderer/WorldRenderer.js

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,6 @@ class WorldRenderer extends Render {
2323
ctx.frontFace(ctx.CCW);
2424
this.mainCamera = new Camera(this.aspectRatio, { fovy: 60, pitch: -90 * Math.PI / 180, position: [0, 20, 0] });
2525
this.addCamera(this.mainCamera);
26-
if (this.isWebGL2)
27-
this.createProgram("showBlock", glsl.showBlock_webgl2.vert, glsl.showBlock_webgl2.frag)
28-
.use().bindTex("blockTex", this.createTextureArray(Block.defaultBlockTextureImg));
29-
else
30-
this.createProgram("showBlock", glsl.showBlock.vert, glsl.showBlock.frag)
31-
.use().bindTex("blockTex", this.createTexture(Block.defaultBlockTextureImg));
32-
this.createProgram("selector", glsl.selector.vert, glsl.selector.frag);
3326
if (world !== null) this.setWorld(world);
3427
};
3528
setWorld(world) {

src/World/World.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -234,13 +234,7 @@ class World extends EventDispatcher {
234234

235235
const {mainPlayer} = this;
236236

237-
let start = mainPlayer.getEyePosition(),
238-
end = mainPlayer.getDirection(20);
239-
vec3.add(start, end, end);
240-
let hit = this.rayTraceBlock(start, end, (x, y, z) => {
241-
let b = this.getBlock(x, y, z);
242-
return b && b.name !== "air";
243-
});
237+
const hit = mainPlayer.controller.getHitting?.() ?? null;
244238
let block = hit? this.getBlock(...hit.blockPos): null;
245239
let longID = hit? this.getTile(...hit.blockPos): null;
246240
let chunk = this.getChunkByBlockXYZ(...[...mainPlayer.position].map(n => n < 0? n - 1: n));

0 commit comments

Comments
 (0)