|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
' R+ V: P5 Q M' s# ^
7 Z5 x5 U# X7 l) n5 q前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。
: X* h* d9 L% Y# h# c; }9 A" i; o F* m" c q0 F) u
这两天为装饰物件添加了对右击响应的支持。) Z9 c* c7 A2 u9 k& e# W: M. Z; ^
/ T3 z! d% }3 N8 K
同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。& t9 [+ E: Y8 e9 ?
$ C1 t1 L6 B4 s, A# u% J
为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。
$ ~4 C6 j1 j+ [* F; L/ E+ e ]$ S! W. w# l4 J: ?
下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。
, A3 K- R' t! Q% f6 @) V- importPackage(java.nio);
- m H6 e' c5 I5 o2 i3 O! f
5 P8 O% K. F( c; p1 `- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z8 U5 H m# a' n8 G' i0 D4 B" B
- model = ModelManager.uploadVertArrays(model);1 A, u$ A3 e% L' s& G. u
- # Y4 L9 g" T, |, n
- function create(ctx, state, entity) {5 v' \* f# t% I( M2 I! c
- state.num = 0;' f0 L" O) U/ P, H: d
- }
; w) j( q2 d% ^8 q - 7 G4 t% k1 k/ m7 t, x* C/ X/ J
- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性. \8 T) X3 x$ q H% i1 R
- let p = player.getPosition();) x6 V j" l# M. G* X1 v- s8 m
- p.add(0, 1.5, 0);// 假定头在脚底往上1.5m F+ h l; Q4 a6 j$ C& E E1 l
- ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);% j$ P' g" ]# s4 D. {+ g
- let ti = Date.now();
Z: d$ f5 G) `. Z# _: N m - // DrawCall为一个接口 仅有一个commit方法0 W: r; V% p6 Z% u
- let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象
$ |, o2 G6 }( R/ M - try {" t9 E0 P1 H5 B; O8 N' \
- let pose = worldPose.copy();
# E1 F# X% r1 D' y& V. o - pose.translate(p);+ k. U/ {8 `- b
- pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);
) K4 l9 C: f- l) q. X7 A
$ c8 P0 i4 J, ]8 J- let buf = FloatBuffer.allocate(16);/ @7 F" P/ d% X" ^) m1 B {# O" h
- pose.store(buf);
) R8 E: v+ r$ o0 F7 y0 S -
* q0 _ F6 i: F) `& K' k2 ] - buf.put(0, 1);1 o8 K/ J/ @% a/ c7 q/ C* r
- buf.put(1, 0);+ m' Y9 a0 {5 T# c
- buf.put(2, 0);" w- A& c5 A/ M% i0 C
- buf.put(3, 0);
* i6 D {) ]) d* l, f
( R8 f# q8 C$ s6 i$ E, [/ ~( b- buf.put(4, 0);
: B( J) J- t# t! A. w Q. c - buf.put(5, 1);& w7 C* J `+ q4 N- g
- buf.put(6, 0);
" h6 o( W X: v4 H% }: X - buf.put(7, 0);
$ M1 Y7 w2 \5 l - 4 E8 Y5 ?1 b: G6 y
- buf.put(8, 0);6 C& I. c: U4 Z) W; D5 w& {
- buf.put(9, 0);; f0 S' B( a. D [$ ^ y
- buf.put(10, 1);" `. b( j: y) t1 R* r. y) t4 _
- buf.put(11, 0);: k7 V& G6 c! x9 |/ n8 q
& @5 j; e# K# j! W5 m: h7 E/ C0 G- pose.load(buf);// 清空旋转信息 始终面向摄像机2 ^& B `' `$ h3 `( P: e' @, O
3 V* x/ ?, A' [! c- drawScheduler.enqueue(model, pose, light);" L! N6 {" ?9 |9 i
- } catch (e) {
+ k* Q1 e( e) V/ X% o: q - ctx.setDebugInfo("Error", e.toString());8 k' |" W0 ]7 \0 {! |
- }
& c z1 V/ L7 E, z) W! O! ` - }});
" t6 a0 `( @! g7 p! x2 i" X - ctx.drawCalls.put(state.num, call);
# y- D6 U' z( P! Y2 f: R- ? - // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...}); + I* ~$ Z. M8 z: A
- // 即 function -> lambda表达式(java) -> DrawCall对象# ?7 _) d) v4 t o1 N1 ^
- state.num++;& x7 ~/ {( L5 K3 F# e
- }
复制代码 ) _. g, I+ w9 y
) n; u& p4 l3 `, K, h/ p: D请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(2 L; r0 h e# i( r* `
2 ~6 H( B8 T! ]+ H2 x% E% [' d
|
|