|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
: Q9 M# u/ p0 V7 a' k0 q
# E2 ]& _" u/ H0 R9 P- t; ]前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。2 e( Z1 z, F6 q
+ Y2 R! L: @. ^ L4 Z这两天为装饰物件添加了对右击响应的支持。
% u6 k% O9 _9 _9 `+ D8 Y2 y
0 _ l3 }6 B& [) p同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。3 V& |" u8 D! J {4 [! X! x
* O" f- {' I3 A( Z7 v' k- v
为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。
5 ^/ q' }4 _' T% b8 b* A) l' K0 X+ S8 B! D7 w
下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。' o R: e% Y' G* {) i
- importPackage(java.nio);. P' O) K( n5 x8 D" g( g
- ' m m z6 E! `; [, m1 I: C
- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z$ u# ]% B6 s$ n2 O: X
- model = ModelManager.uploadVertArrays(model);
# r r$ e6 z u7 n* x% t- _ - 1 O; P1 B5 p) c
- function create(ctx, state, entity) {
/ O: U: B& f$ m. [: W1 W4 R - state.num = 0;* i+ g) y' C7 m, `+ m. Q1 y2 ~
- }# [% G9 x6 {+ a
- , {# S \5 n) C/ X2 V' Y- r1 n
- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性
" f+ V% i8 ?* K1 ?/ U% j9 w - let p = player.getPosition();
8 B5 t$ U, r1 L4 ^/ K0 m6 E - p.add(0, 1.5, 0);// 假定头在脚底往上1.5m1 b+ v. h+ {, S9 V. V7 V# B& L
- ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);
+ r- d. S) N; i/ W4 H, _+ m% K3 f - let ti = Date.now();7 t2 K) U( [; s+ H# N9 i* o
- // DrawCall为一个接口 仅有一个commit方法
8 a4 ^5 q) O$ |- v) G6 | - let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象
% W+ w" k7 g/ q - try {- E) V6 L1 ?4 o+ {8 q$ n
- let pose = worldPose.copy();0 i2 ^+ L- ]- h8 T9 I
- pose.translate(p);
9 v. [* |; w/ C" T9 v& T; N - pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);
+ W( n9 E$ a- d7 j; y
% E/ K( V9 Q' o+ l' R' R' A- let buf = FloatBuffer.allocate(16);" z& s. T) m, J3 v3 {. q1 J$ R
- pose.store(buf);/ m4 v+ C: b5 W1 W* B8 h, u+ P" L0 T
- ' ?6 o5 s8 V$ _) N2 j( U6 k
- buf.put(0, 1);
% f* Y3 f, p! z6 B2 t; @# ^- ]5 C% n - buf.put(1, 0);1 A3 U+ I! P j1 }6 r
- buf.put(2, 0);2 U% w2 {: G# X, H4 a/ Y
- buf.put(3, 0);+ G; ~# X1 H) h! C5 x
& T# I4 H, q% b- b- buf.put(4, 0);* E" P3 i$ O4 X0 r6 Q2 c2 k& t! ^
- buf.put(5, 1);3 k: z7 ~* x) K: O/ [
- buf.put(6, 0);6 a7 z6 n) }) E& x( y
- buf.put(7, 0);
3 K. q' k- S! Y/ i+ W. k3 \- T4 @
3 f" H1 K; n, w$ `- buf.put(8, 0);
5 o' v" [7 ~: G& G* k - buf.put(9, 0);
3 s/ c2 p T# w# v2 M - buf.put(10, 1);
5 C. T: O$ x% X* S6 R% j - buf.put(11, 0);
* s; m& H. ^- K+ z8 Q0 ^8 l# b - / G& `/ [/ d! |4 J4 |) u+ W& Q8 G
- pose.load(buf);// 清空旋转信息 始终面向摄像机- E- C9 d! J4 c, z, `0 t
- , G! X$ G1 c5 n( j8 K
- drawScheduler.enqueue(model, pose, light);
2 G3 o% Z: }9 e, _7 W9 f5 V - } catch (e) {$ ~% Y4 P6 X/ d
- ctx.setDebugInfo("Error", e.toString());- k j& c9 Y, F$ p( \
- }$ n+ B: X) R4 p7 y+ ^" w( M* `0 W
- }});: U0 [3 S( O* q7 @8 K" r; R5 v7 H& }
- ctx.drawCalls.put(state.num, call);, D5 T: W7 }. g6 D8 Z: p
- // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...});
7 E% c+ c) L; P; x! } - // 即 function -> lambda表达式(java) -> DrawCall对象( H; Y+ i- f+ F: o. a6 p; z
- state.num++;4 m$ K2 V9 V, Z; K) a5 m
- }
复制代码 ) ~6 J$ S, h# i+ s- t4 T9 }. _
5 M; }% Q* Y1 I$ F请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(, n% K; Q+ M' Z" v9 v
8 D9 `# v( C7 w- V9 y! g5 b
|
|