https://linen.dev logo
RTM2.4.2xのワイヤーモデルで半透明描画時にNGTTessellatorが発光する
# forum
h
RTM2.4.2xのワイヤー描画スクリプトで、pass === 1のときにNGTTessellatorを用いて描画スクリプト内で面を作ると発光してしまいます。現在この問題を対処すべく色々調べているのですが、 ・ワイヤーのTileEntityがある座標の光量を取得する ・光量を適用して描画する という処理の正しい実装方法がわからず、悩んでいます。 ## 試したこと ##
Copy code
js
function renderWireDynamic(tileEntity, connection, wireVec, par8, pass) {
    ︙
    var isOldPass = pass === undefined;//1.7.10用
    ︙
    var tsl = NGTTessellator.instance;
    var world = tileEntity.func_145831_w();
    var x = tileEntity.field_145851_c;
    var y = tileEntity.field_145848_d;
    var z = tileEntity.field_145849_e;
    var lightLevel = NGTUtil.getLightValue(world, x, y, z);//明るさを取得?
    ︙
    if (isOldPass || pass === 1) {
        GL11.glPushMatrix();
        GLHelper.setBrightness(lightLevel);//明るさを適用?
        renderer.rotate(-pit, 'X', 0, 0, 0);
        GL11.glScalef(1, 1, fenceRate);
        renderTessellator(tsl, fence, height);
        GL11.glPopMatrix();
    }
    ︙
}

function renderTessellator(tsl, data, height) {
    tsl.startDrawingQuads();
    tsl.addVertexWithUV(data[0][0], data[0][1] - height, data[0][2], data[0][3], data[0][4]);
    tsl.addVertexWithUV(data[1][0], data[1][1] - height, data[1][2], data[1][3], data[1][4]);
    tsl.addVertexWithUV(data[2][0], data[2][1], data[2][2], data[2][3], data[2][4]);
    tsl.addVertexWithUV(data[3][0], data[3][1], data[3][2], data[3][3], data[3][4]);
    tsl.draw();
}
としたところ真っ暗なときの明るさを返しているようで、周囲をブロックで囲ったりしても変化がありませんでした。 もし正しい実装方法を知っている方がいらっしゃいましたらご教示ください。
p
参考までに 列車の場合は``` GLHelper.setBrightness(entity.func_70070_b()); ``` で正しい明るさで適応できます。 entityをtileEntityにしてこの方法で実装できませんかね?
h
調べてみたところfunc_70070_bはEntityにしか実装されてなさそうでした・・・
p
entity.field_70170_p.func_72971_b(0)
で太陽の光量を取得することができますが、こちらはどうでしょうか。
一応難読化前載せておきます func_70070_b(さっきの)→getBrightnessForRender field_70170_p→worldObj func_72971_b→getSunBrightness
確かこれはワールド自体の光量なので、これを使って適応させるなら `entity.func_70013_c()`(getBrightness)を使って計算する必要があります。 さきの実装がないようなのでこちらもないかもしれません。
もう一つ試してほしいことがあるのですが、getLightValueによって得られる値の範囲を確認してもらえませんか。 もし0~15であった場合、setBrightnessにいれる値は大雑把に言うと0~240ですので16倍するなど調節を施さないと、実は光量を取得できていても、真っ暗に見えている可能性があるのです。
h
だいぶ遅くなりましたが、問題解決できたためこちらに共有させていただきます。 結論としては、ブロックの光源レベルと空の光源レベルをそれぞれ16倍したうえでビットシフトを使って合成する必要がありました。また、オブジェクトの発光を適用する際にGLHelper.disableLighting()、GLHelper.enableLighting()を使用することで見た目が少し暗くなる問題も解決できました。
Copy code
js
function renderWireDynamic(tileEntity, connection, wireVec, par8, pass) {
    ︙
    var isOldPass = pass === undefined;//1.7.10用
    ︙
    var tsl = NGTTessellator.instance;
    var lightLevel = 0;
    var world = tileEntity.func_145831_w();
    if (!isOldVer) {
        var blockPos = tileEntity.func_174877_v();
        var skyLightLevel = world.func_175642_b(Packages.net.minecraft.world.EnumSkyBlock.SKY, blockPos) * 16;
        var blockLightLevel = world.func_175642_b(Packages.net.minecraft.world.EnumSkyBlock.BLOCK, blockPos) * 16;
        lightLevel = (skyLightLevel << 16) + blockLightLevel;
    }
    else {
        var posX = tileEntity.field_145851_c;
        var posY = tileEntity.field_145848_d;
        var posZ = tileEntity.field_145849_e;
        var skyLightLevel = world.func_72972_b(Packages.net.minecraft.world.EnumSkyBlock.Sky, posX, posY, posZ) * 16;
        var blockLightLevel = world.func_72972_b(Packages.net.minecraft.world.EnumSkyBlock.Block, posX, posY, posZ) * 16;
        lightLevel = (skyLightLevel << 16) + blockLightLevel;
    }
    ︙
    if (isOldPass || pass === 1) {
        GL11.glPushMatrix();
        GLHelper.disableLighting();//---これを追加
        GLHelper.setBrightness(lightLevel);
        renderer.rotate(-pit, 'X', 0, 0, 0);
        GL11.glScalef(1, 1, fenceRate);
        renderTessellator(tsl, fence, height);
        GLHelper.enableLighting();//---これを追加
        GL11.glPopMatrix();
    }
    ︙
}

function renderTessellator(tsl, data, height) {
    tsl.startDrawingQuads();
    tsl.addVertexWithUV(data[0][0], data[0][1] - height, data[0][2], data[0][3], data[0][4]);
    tsl.addVertexWithUV(data[1][0], data[1][1] - height, data[1][2], data[1][3], data[1][4]);
    tsl.addVertexWithUV(data[2][0], data[2][1], data[2][2], data[2][3], data[2][4]);
    tsl.addVertexWithUV(data[3][0], data[3][1], data[3][2], data[3][3], data[3][4]);
    tsl.draw();
}