|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
$ H, U; d9 _6 e# x8 D
5 e) L8 c9 l, F0 Z0 [/ D' ^
前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。; M+ M" i' d" D7 M, O# p( A
9 K5 \8 }/ ^& t. V这两天为装饰物件添加了对右击响应的支持。
* A" r( X) O5 ^* e- z& q$ c! N
7 k# F M$ I9 W3 }同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。; M K; ~5 t. h8 S$ l
7 Y2 b t9 R! |& X/ I
为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。
$ K0 F) H/ h4 D6 \3 M: D3 {, J b' p. _! m( ^# K, R
下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。" L$ F3 Y2 B; N2 A! @' P
- importPackage(java.nio);9 E5 o2 |8 ?$ L) y3 p
5 Q( r b+ J+ H8 M% H$ F+ A- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z) t7 ^# y+ L$ ~$ ^
- model = ModelManager.uploadVertArrays(model);. a& Q6 y* @+ R5 M. p' q0 F, j( v
- 2 T+ k) G9 k3 S' W: r2 ?
- function create(ctx, state, entity) {
8 Y% d- i: p% ^ - state.num = 0;
3 s, `# l4 u9 j N2 [ - }: S3 a. m1 g& I4 N! f) u
- 7 l9 _/ o: c& s7 z
- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性
; W0 Y1 X. L' f$ }0 A6 b - let p = player.getPosition();4 @6 [4 o* d) f5 X
- p.add(0, 1.5, 0);// 假定头在脚底往上1.5m- Z" ^) o( l) [3 h7 L
- ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);: K; X3 d' V8 U8 r# j9 N
- let ti = Date.now();" t" @) q2 }' I+ G
- // DrawCall为一个接口 仅有一个commit方法
7 ]3 U, G- c5 R* Z - let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象7 j+ t$ S) q2 x2 J9 H
- try {
# R" \3 `0 S. L. y8 J - let pose = worldPose.copy();# h( T: m4 M& \3 _
- pose.translate(p);% u+ \) J9 Z: j( w5 e8 R7 Y# V
- pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);
$ Y. U$ u5 p& [2 B; y( V
: l# {: X7 k: C, [: y# [% ]- let buf = FloatBuffer.allocate(16);0 A; F* C! d9 z( V9 T8 ]
- pose.store(buf);
6 i. {" \6 d1 d - : U, m' [3 ?! @& }, s) t
- buf.put(0, 1);4 i" X+ U. m/ K+ h% w1 [) s+ ~
- buf.put(1, 0);
0 y' Y9 W" [# V0 n% ~7 f - buf.put(2, 0);
( P$ K$ U, Q$ O T - buf.put(3, 0);4 s/ w1 q1 g7 j+ f+ r" T E
- # k6 l$ D& b; e$ g: \2 n% m/ U6 d5 }4 o. O
- buf.put(4, 0);
# n: p3 |$ Z* V. S1 |. I/ V$ X3 V - buf.put(5, 1);: `& r7 w) C! A6 y8 G5 Y/ B. J
- buf.put(6, 0);
; ?% x: `* ]* U - buf.put(7, 0);
& L9 s `, R% e4 s
7 R7 D9 t- B/ L2 N/ A: a- buf.put(8, 0);& h/ d0 c% A( `
- buf.put(9, 0);
: Z* z# N) `/ ?( B9 l - buf.put(10, 1);0 a; x7 E: p& Q- t1 P6 f
- buf.put(11, 0);% ^: E: F6 h) q
- & W( K7 j% A- q# @% h2 O6 m
- pose.load(buf);// 清空旋转信息 始终面向摄像机
; U1 e6 q& Y7 A* t - : e2 y( E2 X; D! W' E
- drawScheduler.enqueue(model, pose, light);9 Y8 _/ U( |0 K2 Z9 J( M
- } catch (e) {
. p1 U' ]' p* H5 y$ t4 l7 B - ctx.setDebugInfo("Error", e.toString());8 i) ]1 p: [ [; x) q+ m2 U8 o$ r
- }
) Y+ n8 b; Z) Z$ w# }6 N* c - }});
- }' Y E' u0 Y. {# a* \ - ctx.drawCalls.put(state.num, call);, Z6 Q8 Q- w) m, a) h: Q& w3 P
- // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...}); 1 F( z* y* y. @9 v
- // 即 function -> lambda表达式(java) -> DrawCall对象
3 f/ X. a4 N8 {+ ] - state.num++;+ Y$ n, Z4 m" O
- }
复制代码 u ?" Y3 f$ E1 Z/ q9 e
! t! W3 l# N! z' t l7 x! s/ b请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(4 l# T2 }( V7 N/ `) O, a3 z+ z% o
/ l `1 W2 {) w) `- |, O' d% U$ \
|
|