Skip to content

ある種のVMDファイルを読み込むときにINDEX_SIZE_ERRが出る問題 #4

Description

@legokichi
  • error log

Uncaught Error: INDEX_SIZE_ERR: DOM Exception 1 MMD.Motion.js:121
MMD.Motion.Motion.getSelfShadowMotion MMD.Motion.js:121
MMD.Motion.Motion.parse MMD.Motion.js:44
MMD.Motion.Motion.load.xhr.onload MMD.Motion.js:26

  • VMDファイルの中にはSelfShadowの情報がないものがあります。
  • ソース

DWORD lightCount; // 照明キーフレーム数
struct LightFrame light[lightCount]; // 照明要素データ
// MMDv6.19以前で保存されたVMDはここまで

DWORD sshadowCount; // セルフ影キーフレーム数
struct SelfShadowFrame sShadow[sshadowCount]; // セルフ影要素データ

  • 現行のMMD.Motion#parseはSelfShadowを必ず読みにいくので、SelfShadowのないVMDを読むと、存在しない領域を読み込むこととなり、エラーが発生します。

parse: (buffer) ->
length = buffer.byteLength
view = new DataView(buffer, 0)
offset = 0
offset = @checkHeader(buffer, view, offset)
offset = @getModelName(buffer, view, offset)
offset = @getBoneMotion(buffer, view, offset)
offset = @getMorphMotion(buffer, view, offset)
offset = @getCameraMotion(buffer, view, offset)
offset = @getLightMotion(buffer, view, offset)
offset = @getSelfShadowMotion(buffer, view, offset)

  • これを以下のように変えることを提案します。

parse: (buffer) ->
length = buffer.byteLength
view = new DataView(buffer, 0)
offset = 0
offset = @checkHeader(buffer, view, offset)
offset = @getModelName(buffer, view, offset)
offset = @getBoneMotion(buffer, view, offset)
offset = @getMorphMotion(buffer, view, offset)
offset = @getCameraMotion(buffer, view, offset)
offset = @getLightMotion(buffer, view, offset)
offset = @getSelfShadowMotion(buffer, view, offset) unless offset >= length
offset

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions