ソラマメブログ

2008年10月02日

LSLのカラーに変換するツールを作ってみました^^

なんか最近、どっぷりとセカンドライフのスクリプトにハマってたりします。

とゆっても・・・そろそろ飽きてきたんですが・・・
はは・・


LSLで取り扱うカラーは、普段見慣れない0~1までの小数を使った標記になってるんですが、
#FFFFFFのような、普段使ってる16進数の表記から、LSLのカラー表記に変換するのって
結構めんどくさいんです。

ツール、、さがせばあると思うのですが、LSLにちょっと飽きてきたというのもあって、自分でも作ってみました^^
って、Javascriptも、イチから作るなんてできないので、切り貼りみたいなことなんやけどね。

※めんどくさかったので、Windows版のFirefox3と、Safari3のみの対応です。他のブラウザはチェックしてません。
※っていうか、Javascriptじゃなくて、Flashで作ったらよかった・・・クロスブラウザ処理考えなくていいもんね


■SLColor Convert Tool

16進RGBカラーをSLColorに変換します
16進カラー:

変換結果:

カラーチャート:
 



なお、
(110,120,255)のような10進表記がわかってる場合は、そのままvectorに格納してまとめて255で割るのが手っ取り早いです。

LSLコード:
    vector rgb = <110,120,255>;
    llSetColor(rgb / 255, ALL_SIDES);


じゃあ、以下、ソースコードを貼っておきますね。

■ソースファイル

<script type="text/javascript">
//SLカラー変換 Oct 02, 2008 by Jinko Spitteler
//Ref: http://karafuto50.blog117.fc2.com/blog-entry-80.html
//Ref: http://tech.ocit.jp/?eid=703844
/* SLカラー変換 */
function SLColor() {
    var str = document.getElementById('frmColor').col.value;
    if (! str.match(/#*(([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2}))/i)) {
        document.getElementById('SLcolor').innerHTML = "16進カラーを入力してね♪";
        return;
    }
    var str = RegExp.$1;/* #は使わない */
    var out = "";
    for (var i = 0; i < 3; i++) {
        if ( out != "" ) out += ", ";
        out += (parseInt(RegExp['$' + (i + 2)], 16) / 255).toFixed(3);
    }
    document.getElementById('sample').innerHTML = "■";
    document.getElementById('sample').style.color = "#" + str ;
    document.getElementById('SLcolor').innerHTML = "<" + out + ">";
}

/* カラーチャート*/
function drawColorChart() {
    var out = document.getElementById('col');
    var canvas = document.getElementById('pallete');

    /* エラーチェック */
    if (!canvas.getContext) {
        document.getElementById('charterror').innerHTML = "※お使いのブラウザではチャートは表示されません<br />直接入力してください";
        return;
    }    
    /* カラーチャートを作成 */
    var context = canvas.getContext('2d');
    var sz = 10;
    for ( var r = 0; r < 6; r++) {
        for ( var g = 0; g < 6; g++) {
            for ( var b = 0; b < 6; b++) {
                context.fillStyle = 'rgb(' + r * 51 + ',' + g * 51 + ',' + b * 51 + ')';
                context.fillRect(r * sz * 6 + g * sz, b * sz, sz, sz);
            }
        }
    }
    
    /* マウスムーブイベント */
    canvas.addEventListener('mousemove',
        function(e) {
            var cofs = getElementPosition(canvas);/* カンバスの位置を取得 */
            var pos = {x:e.pageX - cofs.left, y:e.pageY - cofs.top};/*ie未対応*/
            var colorCode = Math.floor( pos.x / sz / 6 ) * 51 * 65536
                         + Math.floor( pos.x % (sz * 6) / sz ) * 51 * 256
                         + Math.floor( pos.y / sz ) * 51;
            colorCode = colorCode.toString( 16 );
            colorCode = '#' + '000000'.substring( colorCode.length, 6) + colorCode;
            out.value = colorCode;
            e.stopPropagation();
        }
    , false);

    /* マウスアップイベント */
    canvas.addEventListener('mouseup', SLColor, false);

}

/* 要素の位置(座標)を取得 */
/* Ref: http://tech.ocit.jp/?eid=703844 */
var msg="";
function getElementPosition(element) {
    var offsetTrail = (typeof element == 'string') ? document.getElementById(element) : element;
    var offsetLeft = 0;
    var offsetTop = 0;

    while (offsetTrail) {
        offsetLeft += offsetTrail.offsetLeft;
        offsetTop += offsetTrail.offsetTop;
        offsetTrail = offsetTrail.offsetParent;
    }

    if ( typeof document.body.leftMargin != "undefined") {
        offsetLeft += document.body.leftMargin;
        offsetTop += document.body.topMargin;
    }

    return ({left: offsetLeft, top: offsetTop});
}
</script>


<div style="border:solid 1px #333; padding:5px;background:#fff;width:480px;"><h2 style="font:bold 16px Helvetica,sans-serif">■SLColor Convert Tool</h2><div style="padding-bottom:5px;">16進RGBカラーをSLColorに変換します</div>

    <div style="width:480px;"><form id="frmColor" onsubmit="SLColor();return false;">
        
        <div style="width:460px;padding:10px;border-bottom:solid 1px #333;">
            <div style="width:100px;float:left;">16進カラー:</div>
            <div style="width:360px;float:right;"><input type="text" id="col"><input type="submit" value="変換" /></div>
            <br style="clear:both;" />
        </div>
        <div style="width:460px;padding:10px;border-bottom:solid 1px #333;">
            <div style="width:100px;float:left;">変換結果:</div>
            <div style="width:360px;float:right;font:bold 16px verdana;"><span id="sample">□</span><span id="SLcolor"></span></div>
            <br style="clear:both;" />
        </div>
        <div style="width:460px;padding:10px;">
            <div style="width:100px;float:left;">カラーチャート:</div>
            <div style="width:360px;float:right;"><canvas id="pallete" width="360" height="60"></canvas><div id="charterror" style="color:#700;font-size:9px;"> </div></div>
            <br style="clear:both;" />
        </div>
    </form></div>
</div>
<div id="debug">
</div>
<script type="text/javascript">drawColorChart();</script>


※基本的に、こちらの記事を思いっきり参考にさせていただきました。
canvas要素でウェブセーフカラーの表を描くスクリプト

※ページ内で表示するためには、こちらの記事の関数をほぼそのまま利用させていただいてます。
JavaScriptで要素の位置(座標)を取得
お二人とも、すばらしいスクリプトを公開していただいてありがとうございました。




(おまけ)
画像インデックスのためにSSも貼っておきますね
クリックしても動かないからねー(←一応念のため)

LSLのカラーに変換するツールを作ってみました^^


同じカテゴリー(Tips)の記事画像
プリムスカートの簡単な作り方のヒミツ。初めてわかりました^^
球面の内側にテクスチャを貼るときの覚書です^^
LSL:日本語文字列をバイト数で長さ制限
スナップショットをレンズぼかしで加工してみました^^
ブラウザからインワールドの検索を使ってます^^
ソラマメ・アルバムのカスタマイズしてみました^^
同じカテゴリー(Tips)の記事
 プリムスカートの簡単な作り方のヒミツ。初めてわかりました^^ (2009-07-11 14:57)
 球面の内側にテクスチャを貼るときの覚書です^^ (2009-06-27 07:28)
 LSL:日本語文字列をバイト数で長さ制限 (2009-04-29 12:06)
 スナップショットをレンズぼかしで加工してみました^^ (2008-10-06 04:14)
 ブラウザからインワールドの検索を使ってます^^ (2008-09-02 17:39)
 ソラマメ・アルバムのカスタマイズしてみました^^ (2008-07-24 23:56)

Posted by jinko at 21:15│Comments(2)Tips
この記事へのコメント
 ジンコありがとー

 いつでもジンコやレモンさんのことを想いよいこと起きるように願ってたりします。

 今後ももち読みにくるからね^^ 

 しかし、ジンコはさすが自分ではわかんない小難しいことを楽しんでおる~

 素敵すぎー^^

 あと、レモンさんの葛飾区の棲家、自分のぶんまで満喫しておいてくださいーっ

 入れないのでジンコに託しますっどうか、おどってきてTwT お願い。

 ジンコとレモンさんたちの今後にいつでも幸あれ~*
Posted by maroa at 2008年10月03日 01:28
まろあーー^^

うんうん、読みにきてねーー
絶対やからねー

小難しいこと・・・中途半端に好きなんですよねー
かといって、中途半端やから、プロにはかなわない・・・

だけど、どうなってるのか気になるので、
いろいろやってみて・・・ほとんど玉砕なんやけど・・・
メモになる程度まとまったら、また記事書いてみたいと思ってます^^

小難しいんやけどねー
あはは^^
Posted by jinkojinko at 2008年10月03日 11:12
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。