|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
) Q3 D7 }1 f6 c& Z2 Q, R# ?4 ~- i) \) k1 J
前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。; A. {2 K" `' d2 {
~6 u( M' ]1 q( x9 g4 M% B5 G这两天为装饰物件添加了对右击响应的支持。
) K2 }8 L( e* I5 z* K2 F7 ` y; H: p- Y( X& L
同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。9 p) O$ {' _$ q0 I0 r, |
4 q& w; u) z9 ]' F
为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。
1 C' j2 R0 y5 V! \8 z4 J7 f
* w S$ j* T" U$ w下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。
7 n+ H8 H9 A, W% @" [7 P- importPackage(java.nio);
4 ~4 ?7 x$ o5 I& X2 d/ T' |6 C - * G) f% E1 v* A9 U1 d) S" B6 H
- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z* J6 ~6 @* ^& J. r
- model = ModelManager.uploadVertArrays(model);% h* j( K. l3 j- g, X
7 ] {) k, w) a! t1 M3 }8 { g- function create(ctx, state, entity) {
# h" a0 O5 ~; E! j! X* W' Z - state.num = 0;- B2 v* H- w0 O+ q
- }& R7 h% [+ `* O8 N$ Z( n* s
- 9 A+ B$ ^- S( w2 Q8 s
- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性
! M5 H% L5 a6 l+ M: |: M0 } - let p = player.getPosition();
7 }3 s/ p) A' Q0 Q5 [) O& n+ Q; J4 K - p.add(0, 1.5, 0);// 假定头在脚底往上1.5m/ F$ f, N8 d6 [) p% N3 F
- ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);
! R' ?, H. a% y1 W2 c - let ti = Date.now();
' z, ?9 s# O, p - // DrawCall为一个接口 仅有一个commit方法
7 ~6 ~8 P& w" V# A7 x - let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象+ U+ W: E" y+ ^ D+ |7 {
- try {
$ M3 _4 M5 K+ j$ u! P - let pose = worldPose.copy();% M3 U5 a. G9 E3 P" P+ d
- pose.translate(p);& b6 S9 y/ r8 ^. t
- pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);
' C6 p9 L& L0 O# U2 Z5 ? - ) K& Y7 Y5 [% E$ q9 R) J% Z6 Q; }
- let buf = FloatBuffer.allocate(16);
0 e2 n$ w- K; o/ ]1 {4 d( E4 w - pose.store(buf);4 |- ]1 _7 A- M! H- V5 s, k3 y
- ) S( n9 `, D9 f
- buf.put(0, 1);
3 C1 ~& B2 {" p, M - buf.put(1, 0);
5 X9 W, {9 C. j: b - buf.put(2, 0);
4 K D) r, ^" X6 ?6 Z: H1 Q1 @- }! Y - buf.put(3, 0);
' v/ S9 F8 h5 T1 g0 Y' ^6 u - P% C2 M( i& L+ ^5 W- f
- buf.put(4, 0);4 [5 f' C- ]& D( \8 I
- buf.put(5, 1);
& n: e% U9 `" v. V- ~8 }) } - buf.put(6, 0);
: O4 U% l: m% H" c - buf.put(7, 0);
6 c, m7 ?3 F2 `' ^5 } - 3 L' q! @- e$ n1 l! E. }
- buf.put(8, 0);
2 T! D# E A( W8 _- X( E - buf.put(9, 0);
) Q5 T0 u3 j0 S& d. c! Y- C - buf.put(10, 1);7 E6 E9 A) n1 d3 l
- buf.put(11, 0);/ ?: M; _1 l: F
- ]& U: z' k8 Y f% z9 s
- pose.load(buf);// 清空旋转信息 始终面向摄像机
+ T* Q, z% B" X2 `, v1 E
6 G$ Y! J( {; O/ F1 R% E- drawScheduler.enqueue(model, pose, light);
`/ B7 J. D5 R, L- V: I+ ? - } catch (e) {! |+ m' d4 `" C8 t ^
- ctx.setDebugInfo("Error", e.toString());8 t# ~7 J( r6 i& V* s
- }
_# @* C* s& ?. t4 i - }});3 A8 z. Q% [% k- k" e7 B& X& F# }
- ctx.drawCalls.put(state.num, call);
; n4 i* C* l" D3 ^* f) }- y - // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...}); # w+ ~( l+ X6 a
- // 即 function -> lambda表达式(java) -> DrawCall对象9 T, {/ U/ y u( T; D
- state.num++;
3 l+ D8 l. M! u" D. v1 r - }
复制代码 " u. q0 I8 j9 [8 H# ^
/ ?$ H/ g# p) k请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(" c( I+ X+ K2 J. X
! A1 O- X7 Y1 f" }2 o. o) Y |
|