Skip to content

Commit a13880f

Browse files
authored
Merge pull request #5 from korarei/refactor/multi-return
Refactor: Make rotate function return multiple values and change laye…
2 parents 227f3f9 + ea89cd2 commit a13880f

3 files changed

Lines changed: 44 additions & 75 deletions

File tree

README.md

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ AviUtl ExEdit2のカメラ操作感を変更するスクリプト群.
6565

6666
親オブジェクトの位置,回転,拡大率によってカメラの座標系を移動させる.
6767

68-
- Use Relative Layer: `Parent Layer`で指定するレイヤー番号を相対値にする.
68+
- Layer Reference: `Parent Layer`で指定するレイヤー番号の参照方法を設定する.
69+
70+
- Absolute: 絶対指定
71+
72+
- Relative: 相対指定
6973

7074
- PI: パラメータインジェクション.
7175

@@ -80,7 +84,7 @@ AviUtl ExEdit2のカメラ操作感を変更するスクリプト群.
8084
rz = 0.0, -- カメラのZ回転 (number)
8185
rot_mode = 21, -- カメラの回転モード (number)
8286
parent_layer = 0, -- 親オブジェクトのレイヤー (number)
83-
use_rel_layer = false -- 親オブジェクトのレイヤーを相対値で設定するかどうか (boolean or number)
87+
layer_ref = 0 -- 親オブジェクトのレイヤーを相対値で設定するかどうか (number)
8488
}
8589
```
8690

@@ -154,7 +158,11 @@ AviUtl ExEdit2のカメラ操作感を変更するスクリプト群.
154158

155159
- Target Layer: 目標オブジェクトのレイヤー.
156160

157-
- Use Relative Layer: `Target Layer`で指定するレイヤー番号を相対値にする.
161+
- Layer Reference: `Target Layer`で指定するレイヤー番号の参照方法を設定する.
162+
163+
- Absolute: 絶対指定
164+
165+
- Relative: 相対指定
158166

159167
- Influence: 影響度.
160168

@@ -163,7 +171,7 @@ AviUtl ExEdit2のカメラ操作感を変更するスクリプト群.
163171
```lua
164172
{
165173
target_layer = 1, -- 目標オブジェクトのレイヤー (number)
166-
use_rel_layer = false, -- 目標オブジェクトのレイヤーを相対値で設定するかどうか (boolean or number)
174+
layer_ref = 0 -- 親オブジェクトのレイヤーを相対値で設定するかどうか (number)
167175
influence = 100.0 -- 影響度 (number)
168176
}
169177
```
@@ -208,7 +216,7 @@ local parent = {
208216
scale = 1.0 -- 根本スケール値 (number)
209217
}
210218

211-
obj.setoption("camera_param",cam)
219+
local cam = obj.getoption("camera_param")
212220
local input = {
213221
x = cam.x,
214222
y = cam.y,
@@ -226,14 +234,13 @@ local input = {
226234

227235
回転モードに応じて複数の3次元ベクトルを回転させる.
228236

229-
`beta15`ではテーブル内テーブルや複数の値を返す関数の設定ができないため`key`に添え字をつける形にした.
230-
231237
|位置|名前||説明|
232238
|:---|:---:|:---:|:---|
233239
|引数 #1|`rot`|table|設定値|
234-
|引数 #2|`vec`|table|3次元ベクトル|
235-
||||同様に vec を追加可能|
236-
|戻り値 #1|`output`|table|回転後のベクトル群|
240+
|引数 #2|`vec_i`|table|3次元ベクトル|
241+
||||同様に`vec_i`を追加可能|
242+
|戻り値 #1|`vec_o`|table|回転後の3次元ベクトル|
243+
||||引数に加えた`vec_i`の数だけ順に回転後のベクトルが返る|
237244

238245
```lua
239246
local rot = {
@@ -249,18 +256,6 @@ local vec = {
249256
y = 0.0, -- Y要素
250257
z = 0.0 -- Z要素
251258
}
252-
253-
local output = {
254-
-- 1つ目のベクトルを回転させたもの
255-
x0 = 0.0,
256-
y0 = 0.0,
257-
z0 = 0.0,
258-
-- 2つ目のベクトルを回転させたもの
259-
x1 = 0.0,
260-
y1 = 0.0,
261-
z1 = 0.0,
262-
-- ...
263-
}
264259
```
265260

266261
### encode_order 関数
@@ -309,6 +304,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
309304
THE SOFTWARE.
310305

311306
## Change Log
307+
- **v1.0.4**
308+
- `rotate`関数を複数値を返す関数に変更.
309+
- `Transform``Track`における`Use Relative Layer`チェックボックスを`Layer Reference`リストに変更 (破壊的)
310+
312311
- **v1.0.3**
313312
- `.mod2`
314313
- `Parent`でアンカーによる仮想的な親オブジェクトを表示するように変更.

dll_src/main.cpp

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -80,32 +80,10 @@ rotate(SCRIPT_MODULE_PARAM *p) {
8080

8181
auto output = Transform::rotate(input, rot);
8282

83-
std::size_t count = output.size();
84-
std::size_t size = count * 3;
85-
std::vector<double> vals(size);
86-
std::vector<std::string> keys(size);
87-
std::vector<LPCSTR> ckeys(size);
88-
89-
for (std::size_t i = 0; i < count; ++i) {
90-
std::size_t x = i * 3;
91-
std::size_t y = x + 1;
92-
std::size_t z = x + 2;
93-
std::string idx = std::to_string(i);
94-
95-
vals[x] = output[i].get_x();
96-
vals[y] = output[i].get_y();
97-
vals[z] = output[i].get_z();
98-
99-
keys[x] = "x" + idx;
100-
keys[y] = "y" + idx;
101-
keys[z] = "z" + idx;
102-
103-
ckeys[x] = keys[x].c_str();
104-
ckeys[y] = keys[y].c_str();
105-
ckeys[z] = keys[z].c_str();
106-
}
83+
LPCSTR keys[] = {"x", "y", "z"};
84+
int size = std::size(keys);
10785

108-
p->push_result_table_double(ckeys.data(), vals.data(), static_cast<int>(size));
86+
for (auto &v : output) p->push_result_table_double(keys, v.ptr(), size);
10987
}
11088

11189
void

scripts/@CameraTransform_K_template.cam2

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
--track6:Z Rotation,-3600,3600,0,0.01
1111
--select@s0:Rotation Mode=21,Quaternion=0,Axis Angle=1,XYZ Euler=5,XZY Euler=7,YXZ Euler=11,YZX Euler=15,ZXY Euler=19,ZYX Euler=21
1212
--track7:Parent Layer,-100,100,0,1
13-
--check0:Use Relative Layer,0
13+
--select@s1:Layer Reference,Absolute=0,Relative=1
1414
--value@_0:PI,{}
1515

1616
if (obj.getinfo("version") < 2001500) then
@@ -28,18 +28,13 @@ local ry = tonumber(_0.ry) or obj.track5
2828
local rz = tonumber(_0.rz) or obj.track6
2929
local rot_mode = tonumber(_0.rot_mode) or s0 s0 = nil
3030
local parent_layer = math.floor(tonumber(_0.parent_layer) or obj.track7)
31-
local use_rel_layer = obj.check0
32-
if (type(_0.use_rel_layer) == "boolean") then
33-
use_rel_layer = _0.use_rel_layer
34-
elseif (type(_0.use_rel_layer) == "number") then
35-
use_rel_layer = _0.use_rel_layer ~= 0
36-
end
31+
local layer_ref = tonumber(_0.layer_ref) or s1 s1 = nil
3732
_0 = nil
3833

3934
local lib = obj.module("CameraTransform_K")
4035
local cam = obj.getoption("camera_param")
4136

42-
local layer = use_rel_layer and math.max(obj.layer + parent_layer, 1) or math.max(parent_layer, 0)
37+
local layer = layer_ref == 1 and math.max(obj.layer + parent_layer, 1) or math.max(parent_layer, 0)
4338
local parent = {
4439
type = 0,
4540
x = 0.0,
@@ -160,24 +155,21 @@ local rot = {
160155
}
161156

162157
local elem = math.min(obj.screen_w, obj.screen_h) * 0.25 * scale
163-
local vx = Vec:new(elem, 0.0, 0.0)
164-
local vy = Vec:new(0.0, elem, 0.0)
165-
local vz = Vec:new(0.0, 0.0, elem)
158+
local dx = Vec:new(elem, 0.0, 0.0)
159+
local dy = Vec:new(0.0, elem, 0.0)
160+
local dz = Vec:new(0.0, 0.0, elem)
166161

167162
local cam = obj.getoption("camera_param")
168163
local pos = Vec:new(x - cam.x, y - cam.y, z - cam.z)
169-
local col = Vec:new(0xf05050, 0x208020, 0x5050f0)
164+
local col = {0xf05050, 0x208020, 0x5050f0}
170165

171166
local lib = obj.module("CameraTransform_K")
172-
local output = lib.rotate(rot, vx, vy, vz)
173-
174-
vx = Vec:new(output.x0, output.y0, output.z0) + pos
175-
vy = Vec:new(output.x1, output.y1, output.z1) + pos
176-
vz = Vec:new(output.x2, output.y2, output.z2) + pos
167+
dx, dy, dz = lib.rotate(rot, dx, dy, dz)
177168

178-
obj.setanchor({pos.x, pos.y, pos.z, vx.x, vx.y, vx.z}, 2, "line", "xyz", "color", col.x)
179-
obj.setanchor({pos.x, pos.y, pos.z, vy.x, vy.y, vy.z}, 2, "line", "xyz", "color", col.y)
180-
obj.setanchor({pos.x, pos.y, pos.z, vz.x, vz.y, vz.z}, 2, "line", "xyz", "color", col.z)
169+
for i, v in ipairs({dx, dy, dz}) do
170+
local t = v + pos
171+
obj.setanchor({pos.x, pos.y, pos.z, t.x, t.y, t.z}, 2, "line", "xyz", "color", col[i])
172+
end
181173

182174
local name = obj.getoption("script_name", 1, true)
183175
if (name == "Transform@CameraTransform_K") then
@@ -202,18 +194,18 @@ end
202194
--infomation:Track${SCRIPT_NAME} ${VERSION} by ${AUTHOR}
203195
--label:${LABEL}
204196
--track0:Target Layer,-100,100,1,1
205-
--check0:Use Relative Layer,0
197+
--select@s0:Layer Reference,Absolute=0,Relative=1
206198
--track1:Influence,0,100,100,0.01
207199
--value@_0:PI,{}
208200

201+
if (obj.getinfo("version") < 2001500) then
202+
debug_print("AviUtl ExEdit2 beta15 or later is required.")
203+
return
204+
end
205+
209206
_0 = _0 or {}
210207
local target_layer = math.floor(tonumber(_0.target_layer) or obj.track0)
211-
local use_rel_layer = obj.check0
212-
if (type(_0.use_rel_layer) == "boolean") then
213-
use_rel_layer = _0.use_rel_layer
214-
elseif (type(_0.use_rel_layer) == "number") then
215-
use_rel_layer = _0.use_rel_layer ~= 0
216-
end
208+
local layer_ref = tonumber(_0.layer_ref) or s0 s0 = nil
217209
local influence = (tonumber(_0.influence) or obj.track1) * 0.01
218210
_0 = nil
219211

@@ -223,7 +215,7 @@ end
223215

224216
local cam = obj.getoption("camera_param")
225217
local tx, ty, tz = 0.0, 0.0, 0.0
226-
local layer = math.max(use_rel_layer and obj.layer + target_layer or target_layer, 1)
218+
local layer = math.max(layer_ref == 1 and obj.layer + target_layer or target_layer, 1)
227219
if (layer ~= obj.layer and obj.getvalue("layer" .. layer .. ".x")) then
228220
tx = obj.getvalue("layer" .. layer .. ".x")
229221
ty = obj.getvalue("layer" .. layer .. ".y")

0 commit comments

Comments
 (0)