Table of Contents

Introduction

One of the commercial and very expensive objects you can purchase on marketplace is a zero-primitive holo display. That is, the object is a board that will display text messages by changing the texture of the tiles. However, since for a simple 10x10-tile board one would already consume 100 primitives, the board contains a mechanism that continuously rezzes the tiles as temporary over and over again and applies the corresponding letter texture.

This is the opensource version, courtesy of Wizardry and Steamworks.

Limitations

Setup

The Holo Display is made of two scripts:

Both objects are named, meaning that the scripts rely on them having exactly those names.

Tile to be Rezzed

The [K] Holo Tile is a primitive that contains just one script:

and the following textures which are created by Steve Matteson and carries an Apache License which is compatible with GNU GPLv3:

File Asset UUID
ASCII Number 126d8b54f47-56cc-a306-e08d-7ccc17d973f1
ASCII Number 12565a27c6e-dbcc-c7a6-b79e-5e4b85480f56
ASCII Number 124773b742a-0b17-c412-61c9-46da7a4fd188
ASCII Number 12373c81fad-fe69-c9c1-e624-1e62121619a7
ASCII Number 122e3b11806-6fc2-c93a-0395-8460ef262a1b
ASCII Number 1214137395e-adcc-fb88-73ff-b30e721bc81c
ASCII Number 120fcfa1923-097e-44b3-faf6-9b7070c5dd75
ASCII Number 119c8997016-7d81-542e-0160-a534936ba5f9
ASCII Number 11834fa461b-9789-da82-7d03-ff596c49078d
ASCII Number 117e3a71a2a-3901-82d0-0047-d20ed37a334f
ASCII Number 1164dda7e97-fdff-c9d0-2d58-540b9e888475
ASCII Number 1150994a922-e4b6-fd37-5c98-c04c37b83b46
ASCII Number 1146d07262d-198c-8267-eb9e-34252fd92a17
ASCII Number 11393ee26d4-3cad-b840-9e51-fbaa66a70030
ASCII Number 1128e1a7884-b653-06a2-27ae-df7bad1b38af
ASCII Number 11152f426ad-a960-32f6-6f91-17ebf007f346
ASCII Number 110f74c18a9-3ac8-d40d-b04b-954ff50bc800
ASCII Number 1094933e0cb-13d0-6be0-e4e7-fc28f3b7dd1f
ASCII Number 108757c7c0b-b686-a86b-b817-b2f168ab95cd
ASCII Number 107466ea6e8-9497-d796-14c3-db04645fe3f0
ASCII Number 10663aeaa2a-abbd-2098-4338-e42f16c82798
ASCII Number 105afa14604-4770-5070-ada1-7a7846b7ac50
ASCII Number 1043e7101d9-ad42-6ba0-0d85-6e4ee6dc338d
ASCII Number 1030b3730e8-87c3-99ae-3fa6-d51fb8f6802d
ASCII Number 102ef3eff41-2c6e-1e70-ec7f-7f44d1bd62f5
ASCII Number 1014992e3b5-595c-a14b-2528-4dbb7f936d94
ASCII Number 100af7b4c4c-2ff7-80d3-2849-d5822addf287
ASCII Number 99fbc404a0-86c6-6ec0-e937-0a6beaada5bc
ASCII Number 98b6595a6f-8715-b87b-232e-4ac7e87a9f7e
ASCII Number 97ae5e56d4-bf7e-3028-cffe-9115a85dca53
ASCII Number 96377e5b6c-5649-4eb4-13b8-127b264c8b5c
ASCII Number 950b8719d7-2fe6-2bc5-9ee9-94a2bf39e52d
ASCII Number 94ea6515b1-c436-9090-f593-6fc997e1baad
ASCII Number 93f91c30ad-1f41-0161-1ece-730c66a15625
ASCII Number 9290da5e13-d0f9-3bd1-0753-20b23c5bfc13
ASCII Number 91f3ba29bd-cdb0-2a27-a7f5-84bfefde1eb4
ASCII Number 90a0e9567d-abc6-be31-e526-b43cf5d36518
ASCII Number 89039447f7-7824-efe7-46fe-b59471616cdb
ASCII Number 882675b59d-ad29-9969-e5a3-34ca5345d510
ASCII Number 87f37cdc18-bf3c-4d39-c8d8-4a6708fcce8a
ASCII Number 86e0954dc1-7641-6179-f238-bd3a95a7a753
ASCII Number 85d01fafd5-da8f-e8b1-761d-1d204c65ae5c
ASCII Number 840fb0b222-bb4b-2383-5c01-66fdad9e5ad6
ASCII Number 83662edfa4-7a5b-6fa0-c2dc-70032c15b4c9
ASCII Number 8297e0be84-dc52-9147-8e25-75a1809f64d2
ASCII Number 81d0910e94-408b-7873-8523-12ca6c3eaffc
ASCII Number 80d844c72c-baa8-e449-278a-15d1986bbcd5
ASCII Number 7953909715-1cea-5b39-d491-10c6a86f034d
ASCII Number 7823f068ef-e897-b69e-5bb3-c23079641e77
ASCII Number 770240ba93-8704-ceec-e917-1ec27792cc69
ASCII Number 7682ed5956-835c-9580-769f-812dab6b6f04
ASCII Number 75ea2c5050-d95a-adbe-40b9-5b8208d377c9
ASCII Number 74cf878b0a-eb17-cf5f-abe0-2457d14a3209
ASCII Number 737f72b788-aa03-b12c-64d4-08ff42fd0d76
ASCII Number 72ce6cb5e3-4960-7c32-c5b9-60ef717e733d
ASCII Number 71d1a1216f-fa64-93fb-e3ac-9b61935be0e7
ASCII Number 706898db10-e43e-08fb-cd7f-a78ea1ddd8a4
ASCII Number 69a2f9d98e-a0b6-3d34-669a-ff53aa6263e3
ASCII Number 68d524ddaf-0d05-bda5-aced-70871266d18e
ASCII Number 67eafdb177-d952-bc02-fef8-6d5549c75dca
ASCII Number 661d6449e4-4c7d-f84a-1472-b07559b0221e
ASCII Number 65ee30cc90-918f-11fc-db29-412be076c0c1
ASCII Number 6416fd6a5d-ff62-85c5-d6d7-1b86b498b458
ASCII Number 632135e922-4fb4-6e79-2f03-993938a50572
ASCII Number 6264538835-67b3-1554-b8e0-4ddba7fb01be
ASCII Number 618a6dd86c-488e-25f7-befc-3d30db7b789b
ASCII Number 608b310383-376e-8a77-9c07-e3f71e0ef93c
ASCII Number 59b61712f4-b492-b15f-76f3-701dae7ac8e6
ASCII Number 5824f4146b-da33-2301-defe-0c473668f6eb
ASCII Number 57355bdc23-c7f2-83e8-84d1-c5fe72efe6c4
ASCII Number 56bf634086-3400-7753-17e1-eaa5daf1c505
ASCII Number 55e031e370-7a27-0515-1955-84e2fe48dd66
ASCII Number 54b42df016-eb61-02df-78b2-5490596ffe44
ASCII Number 53f7fd10e5-54db-4013-52ba-6c3aa16d58f7
ASCII Number 520fffbe33-258e-24c4-eb94-1b69e034225b
ASCII Number 51662cbeeb-b2e5-e65e-a347-938142c5ce3a
ASCII Number 505569f0e7-8ee9-de8b-6bd0-b24f68e1191b
ASCII Number 4992595b6b-7551-6b7b-913e-38f1cb32cfa6
ASCII Number 4836657cbe-a6c8-f812-912f-bb4ac661fd47
ASCII Number 474bddb509-aef0-55d3-4e04-2e4a67ea2aea
ASCII Number 461c7f3347-ccf1-ee6f-6f91-d9a345aa2cf6
ASCII Number 4550923169-33e0-c759-b5c0-19a4aa1e88b2
ASCII Number 44f72e316c-55d0-7c9a-c5d9-4d7df13f233d
ASCII Number 43d5f4b2bf-d396-5ae9-500b-90283f5e8df4
ASCII Number 4290823a84-3c64-60cd-35d0-cdcb1873371a
ASCII Number 411ee3d1b0-3c00-eeec-7224-07690daa95ea
ASCII Number 40af1b8821-725c-b3a9-4b58-57326ec6cacc
ASCII Number 39c9e96d68-f2ae-d591-3bc7-31f56ff8a353
ASCII Number 38bb61bd21-8a84-3bce-bee8-d1ee23188637
ASCII Number 3752aa48d3-40c4-2da2-e46f-1a98b33cb696
ASCII Number 36cf9bd934-eb7f-686e-918d-c6867ab36346
ASCII Number 35bd84abb9-5d0f-9697-6558-b633b2509373
ASCII Number 34a4406722-cd3b-d693-3bc1-61bed4249c13
ASCII Number 337a5d01e0-8841-cfa9-cd3e-f462a8a1ce03
ASCII Number 326325f460-f5e8-1d45-9764-d2a1fe790374

Wizardry and Steamworks wishes you a mellow time uploading 95 textures. Otherwise, you can alter the code and reference them there by using the texture asset UUID (key) and spare yourself a whopping L$950 (that's why we posted the UUIDs here).

The last texture ASCII 32 with the asset UUID 6325f460-f5e8-1d45-9764-d2a1fe790374 is space, which is a blank texture. It may be used to create invisible primitives which are much better than the textures offered by hacked viewers (they don't seem to have collisions with water).

[K] Holo Panel

The [K] Holo Panel contains 5 scripts, some of them optional:

All these scripts must be placed in a primitive named [K] Holo Panel.

Overview

The ''[K] Tile'' is selected, containing the ''[K] Holo'' script and all the letter textures.

Usage

Once you set-up the primitives, you can click the [K] Holo Panel to start deploying [K] Tiles. After all the [K] Tiles have been deployed, the [K] Holo Panel will stay there and process rez-requests. You can type something on local chat in order to test the system.

Extending

The code may of course be extended, depending on the application, to process messages from things such as llTextBox or add the messages line-by-line.

Code: [K] Holo

This part is supposed to go in the tile to be rezzed.

holo.lsl
//////////////////////////////////////////////////////////
//     WaS (c) grimore.org - 2011, License: GPLv3  with the//
// exception of the Ord function created by Pedro    //
// Oval which carries an unknown license.                //
//////////////////////////////////////////////////////////
 
// Ord() function, written by Pedro Oval, 2010-05-28
// This function works by using llEscapeURL to find the corresponding UTF-8
// string then converts it to the Unicode code. In cases where llEscapeURL
// doesn't help, a combination of llStringToBase64 and llBase64ToInteger
// does the job instead.
integer Ord(string chr)
{
    if (chr == "")
        return 0;
    string hex = llEscapeURL(chr);
    if (llGetSubString(hex, 0, 0) != "%")
    {
        // Regular character - we can't take advantage of llEscapeURL in this case,
        // so we use llStringToBase64/llBase64ToInteger instead.
        return llBase64ToInteger("AAAA" + llStringToBase64(llGetSubString(chr, 0, 0)));
    }
    integer b = (integer)("0x" + llGetSubString(hex, 1, 2));
    if (b < 194 || b > 244)
        return b;
    if (b < 224)
        return ((b & 0x1F) << 6) | (integer)("0x" + llGetSubString(hex, 4, 5)) & 0x3F;
    integer cp;
    if (b < 240)
    {
        cp = (b & 0x0F) << 12;
        cp += ((integer)("0x" + llGetSubString(hex, 4, 5)) & 0x3F) << 6;
        cp += (integer)("0x" + llGetSubString(hex, 7, 8)) & 0x3F;
        return cp;
    }
    cp = (b & 0x07) << 18;
    cp += ((integer)("0x" + llGetSubString(hex, 4, 5)) & 0x3F) << 12;
    cp += ((integer)("0x" + llGetSubString(hex, 7, 8)) & 0x3F) << 6;
    cp += (integer)("0x" + llGetSubString(hex, 10, 11)) & 0x3F;
    return cp;
}
 
key _owner = NULL_KEY;
string letter = "";
integer comChannel = 0;
 
default
{
    state_entry() {
        _owner = llGetOwner();
        comChannel = ((integer)("0x"+llGetSubString((string)llGetOwner(),-8,-1)) & 0x3FFFFFFF) ^ 0xBFFFFFFF;
        llListen(comChannel, "[K] Holo Panel", "", "");
    }
    listen(integer channel, string name, key id, string message) {
        list pSet = llCSV2List(message);
        integer idx = llListFindList(pSet, (list)llGetObjectDesc());
        if(~idx) letter = llList2String(pSet,idx+1);
        if(letter == "") letter = " ";
        llSetTexture("OpenSans_Regular_" + (string)Ord(letter), 3);
    }
    timer() {
        llWhisper(comChannel, "die," + llGetObjectDesc() + ",pos," + (string)llGetPos() + ",let," + letter);
        llDie();
    }
    on_rez(integer param) {
        llSetTimerEvent(56.25); // alarm - see http://grimore.org/wiki/Wizardry_and_Steamworks/Randomness,_Entropy_and_Statistics
        llSetObjectDesc((string)param);
        _owner = llGetOwner();
    }
    changed(integer change) {
        if(change & CHANGED_OWNER)
            _owner = llGetOwner();
    }
}

Code: [K] FTC

This is the fast-texture cache adapted from lsl and should go in the rezzer itself.

holo_ftc.lsl
//////////////////////////////////////////////////////////
//   (C) Wizardry and Steamworks 2011, license: GPLv3   //
//////////////////////////////////////////////////////////
// Requires: link message, string set to "kpre", string of 
// texture keys separated by commas.
// Provides: link message, string set to "kok" when ready.
//////////////////////////////////////////////////////////
// About: A script to cache textures and keep them alive.
//////////////////////////////////////////////////////////
list slides = [ 
"d8b54f47-56cc-a306-e08d-7ccc17d973f1",
"65a27c6e-dbcc-c7a6-b79e-5e4b85480f56",
"773b742a-0b17-c412-61c9-46da7a4fd188",
"73c81fad-fe69-c9c1-e624-1e62121619a7",
"e3b11806-6fc2-c93a-0395-8460ef262a1b",
"4137395e-adcc-fb88-73ff-b30e721bc81c",
"fcfa1923-097e-44b3-faf6-9b7070c5dd75",
"c8997016-7d81-542e-0160-a534936ba5f9",
"34fa461b-9789-da82-7d03-ff596c49078d",
"e3a71a2a-3901-82d0-0047-d20ed37a334f",
"4dda7e97-fdff-c9d0-2d58-540b9e888475",
"0994a922-e4b6-fd37-5c98-c04c37b83b46",
"6d07262d-198c-8267-eb9e-34252fd92a17",
"93ee26d4-3cad-b840-9e51-fbaa66a70030",
"8e1a7884-b653-06a2-27ae-df7bad1b38af",
"52f426ad-a960-32f6-6f91-17ebf007f346",
"f74c18a9-3ac8-d40d-b04b-954ff50bc800",
"4933e0cb-13d0-6be0-e4e7-fc28f3b7dd1f",
"757c7c0b-b686-a86b-b817-b2f168ab95cd",
"466ea6e8-9497-d796-14c3-db04645fe3f0",
"63aeaa2a-abbd-2098-4338-e42f16c82798",
"afa14604-4770-5070-ada1-7a7846b7ac50",
"3e7101d9-ad42-6ba0-0d85-6e4ee6dc338d",
"0b3730e8-87c3-99ae-3fa6-d51fb8f6802d",
"ef3eff41-2c6e-1e70-ec7f-7f44d1bd62f5",
"4992e3b5-595c-a14b-2528-4dbb7f936d94",
"af7b4c4c-2ff7-80d3-2849-d5822addf287",
"fbc404a0-86c6-6ec0-e937-0a6beaada5bc",
"b6595a6f-8715-b87b-232e-4ac7e87a9f7e",
"ae5e56d4-bf7e-3028-cffe-9115a85dca53",
"377e5b6c-5649-4eb4-13b8-127b264c8b5c",
"0b8719d7-2fe6-2bc5-9ee9-94a2bf39e52d",
"ea6515b1-c436-9090-f593-6fc997e1baad",
"f91c30ad-1f41-0161-1ece-730c66a15625",
"90da5e13-d0f9-3bd1-0753-20b23c5bfc13",
"f3ba29bd-cdb0-2a27-a7f5-84bfefde1eb4",
"a0e9567d-abc6-be31-e526-b43cf5d36518",
"039447f7-7824-efe7-46fe-b59471616cdb",
"2675b59d-ad29-9969-e5a3-34ca5345d510",
"f37cdc18-bf3c-4d39-c8d8-4a6708fcce8a",
"e0954dc1-7641-6179-f238-bd3a95a7a753",
"d01fafd5-da8f-e8b1-761d-1d204c65ae5c",
"0fb0b222-bb4b-2383-5c01-66fdad9e5ad6",
"662edfa4-7a5b-6fa0-c2dc-70032c15b4c9",
"97e0be84-dc52-9147-8e25-75a1809f64d2",
"d0910e94-408b-7873-8523-12ca6c3eaffc",
"d844c72c-baa8-e449-278a-15d1986bbcd5",
"53909715-1cea-5b39-d491-10c6a86f034d",
"23f068ef-e897-b69e-5bb3-c23079641e77",
"0240ba93-8704-ceec-e917-1ec27792cc69",
"82ed5956-835c-9580-769f-812dab6b6f04",
"ea2c5050-d95a-adbe-40b9-5b8208d377c9",
"cf878b0a-eb17-cf5f-abe0-2457d14a3209",
"7f72b788-aa03-b12c-64d4-08ff42fd0d76",
"ce6cb5e3-4960-7c32-c5b9-60ef717e733d",
"d1a1216f-fa64-93fb-e3ac-9b61935be0e7",
"6898db10-e43e-08fb-cd7f-a78ea1ddd8a4",
"a2f9d98e-a0b6-3d34-669a-ff53aa6263e3",
"d524ddaf-0d05-bda5-aced-70871266d18e",
"eafdb177-d952-bc02-fef8-6d5549c75dca",
"1d6449e4-4c7d-f84a-1472-b07559b0221e",
"ee30cc90-918f-11fc-db29-412be076c0c1",
"16fd6a5d-ff62-85c5-d6d7-1b86b498b458",
"2135e922-4fb4-6e79-2f03-993938a50572",
"64538835-67b3-1554-b8e0-4ddba7fb01be",
"8a6dd86c-488e-25f7-befc-3d30db7b789b",
"8b310383-376e-8a77-9c07-e3f71e0ef93c",
"b61712f4-b492-b15f-76f3-701dae7ac8e6",
"24f4146b-da33-2301-defe-0c473668f6eb",
"355bdc23-c7f2-83e8-84d1-c5fe72efe6c4",
"bf634086-3400-7753-17e1-eaa5daf1c505",
"e031e370-7a27-0515-1955-84e2fe48dd66",
"b42df016-eb61-02df-78b2-5490596ffe44",
"f7fd10e5-54db-4013-52ba-6c3aa16d58f7",
"0fffbe33-258e-24c4-eb94-1b69e034225b",
"662cbeeb-b2e5-e65e-a347-938142c5ce3a",
"5569f0e7-8ee9-de8b-6bd0-b24f68e1191b",
"92595b6b-7551-6b7b-913e-38f1cb32cfa6",
"36657cbe-a6c8-f812-912f-bb4ac661fd47",
"4bddb509-aef0-55d3-4e04-2e4a67ea2aea",
"1c7f3347-ccf1-ee6f-6f91-d9a345aa2cf6",
"50923169-33e0-c759-b5c0-19a4aa1e88b2",
"f72e316c-55d0-7c9a-c5d9-4d7df13f233d",
"d5f4b2bf-d396-5ae9-500b-90283f5e8df4",
"90823a84-3c64-60cd-35d0-cdcb1873371a",
"1ee3d1b0-3c00-eeec-7224-07690daa95ea",
"af1b8821-725c-b3a9-4b58-57326ec6cacc",
"c9e96d68-f2ae-d591-3bc7-31f56ff8a353",
"bb61bd21-8a84-3bce-bee8-d1ee23188637",
"52aa48d3-40c4-2da2-e46f-1a98b33cb696",
"cf9bd934-eb7f-686e-918d-c6867ab36346",
"bd84abb9-5d0f-9697-6558-b633b2509373",
"a4406722-cd3b-d693-3bc1-61bed4249c13",
"7a5d01e0-8841-cfa9-cd3e-f462a8a1ce03",
"6325f460-f5e8-1d45-9764-d2a1fe790374" 
];
 
integer gitra = 0;
 
default
{
    state_entry() {
        // Thanks for the music Salahzar Stenvaag, 10 faces is cool!
        llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_PRISM, 32, <.199, .8, .0>, .30, <.0, .0, .0>, 
        <1, 1, .0>, <.0, .0, .0>, PRIM_SIZE, <.03, 2.89, .5>, PRIM_COLOR, ALL_SIDES, <1,1,1>, .0 ]);
        llSetTimerEvent(1.02-llGetRegionTimeDilation());
    }
    timer() {
        llSetTimerEvent(0);
        if(gitra == llGetListLength(slides)) {
            gitra = 0;
        }
        integer itra=llGetNumberOfSides()-1;
        do {
            if(llList2Key(slides, gitra+itra))
                llSetTexture(llList2Key(slides, gitra+itra), itra);
        } while(--itra>-1);
        ++gitra;
        llSetTimerEvent(1.02-llGetRegionTimeDilation());
    }
}

Code: [K] Holo Display Tiler

This is just Planar Tile Generator and should go in the rezzer.

holo_displaytiler.lsl
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2011 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////
 
//////////////////////////////////////////////////////////
//                   CONFIGURATION                      //
//////////////////////////////////////////////////////////
// The height of the generated board.
integer BOARD_HEIGHT = 10;
// The width of the generated board.
integer BOARD_WIDTH = 10;
// The delay between rezzing the object in the primitive.
float SPEED = .2;
// Set this to the scale of the primitive inside the object.
vector OBJECT_SCALE = <.1,.1,.1>;
// Set this to the name of the object to rez.
string TILE_NAME = "[K] Holo Tile";
 
//////////////////////////////////////////////////////////
//                      INTERNALS                       //
//////////////////////////////////////////////////////////
integer runner = 0;
integer gitra = 0;
integer gitrb = 0;
vector tilePos = ZERO_VECTOR;
 
default {
 
    state_entry() {
        llSay(0, "Click the glowing prim to deploy more tiles.");
    }
 
    touch_start(integer total_number) {
        // Sanity.
        if(BOARD_HEIGHT*BOARD_WIDTH < 1) {
            llSay(DEBUG_CHANNEL, "Sorry, the width and height have to be larger than zero. Aborting.");
            return;
        }
        if(TILE_NAME == "") {
            llSay(DEBUG_CHANNEL, "Sorry, I could not find an object in the inventory to rez. Aborting.");
            return;
        }
        runner = BOARD_HEIGHT*BOARD_WIDTH;
        tilePos = llGetPos();
        state deploy;
    }
}
 
state deploy {
 
    state_entry() {
        llSay(0, "Please wait, deploying prims. Touch To stop...");
        llSetTimerEvent(SPEED);
    }
    touch_start(integer num) {
        llSetTimerEvent(0);
        state default;
    }
    timer() {
        llSetTimerEvent(0);
        if(runner > BOARD_WIDTH*BOARD_HEIGHT) {
            state default;
            return;
        }
        if(gitrb < BOARD_HEIGHT) {
            if(gitra < BOARD_WIDTH-1) {
                llRezObject(TILE_NAME,tilePos,ZERO_VECTOR,ZERO_ROTATION,runner--);
                tilePos.x += OBJECT_SCALE.x;
                llSetPos(tilePos);
                // llSetLinkPrimitiveParamsFast(LINK_THIS, [OBJECT_POS, tilePos]); // Thanks, FailedNoob Resident. - SL Compatible
                ++gitra;
                llSetTimerEvent(SPEED);
                return;
            }
            llRezObject(TILE_NAME,tilePos,ZERO_VECTOR,ZERO_ROTATION,runner--);
            tilePos.z += OBJECT_SCALE.z;
            tilePos.x -= (BOARD_WIDTH-1)*OBJECT_SCALE.x;
            llSetPos(tilePos);
            // llSetLinkPrimitiveParamsFast(LINK_THIS, [OBJECT_POS, tilePos]); // Thanks, FailedNoob Resident. - SL Compatible
            //OBJECT_SCALE.x *= -1;
            ++gitrb;
            gitra = 0;
            llSetTimerEvent(SPEED);
            return;
        }
    }
}

Code: [K] Regen

This is the regenerator that dispatches rez requests to the rezzers and should go in the rezzer primitive itself.

holo_regen.lsl
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2011 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////
 
// Set this to the amount of rezzers.
integer REZZERS = 5;
 
key _owner = NULL_KEY;
integer runner = 0;
 
default
{
    state_entry() {
        _owner = llGetOwner();
        integer comChannel = ((integer)("0x"+llGetSubString((string)llGetOwner(),-8,-1)) & 0x3FFFFFFF) ^ 0xBFFFFFFF;
        llListen(comChannel, "[K] Holo Tile", "", "");
    }
    listen(integer channel, string name, key id, string message) {
        if(runner >= REZZERS) runner = 0;
        llMessageLinked(LINK_THIS, runner++, message, "rez");
    }
    on_rez(integer param) {
        _owner = llGetOwner();
    }
    changed(integer change) {
        if(change & CHANGED_OWNER) {
            _owner = llGetOwner();
        }
    }
}

Code: [K] Rezzer

This is one of the rezzers. You must configure the REZZER_ID in the configuration section of the script and set it for each rezzer you want to have. This script should go in the rezzer itself.

holo_rezzer.lsl
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2011 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////
 
//////////////////////////////////////////////////////////
//                   CONFIGURATION                      //
//////////////////////////////////////////////////////////
// The id of the rezzer, change this for as many rezzers as 
// you wish to have. First rezzer has an ID of 0, second 1, ...
integer REZZER_ID = 0;
//////////////////////////////////////////////////////////
//                      INTERNALS                       //
//////////////////////////////////////////////////////////
 
default
{
    link_message(integer sender_num, integer num, string str, key id) {
        if(id != "rez" || num != REZZER_ID) return;
        list dList = llCSV2List(str);
        vector tilePos = ZERO_VECTOR;
        list tileVec = llParseString2List(llList2String(dList,3), ["<", ">", ","], []);
        tilePos.x = llList2Float(tileVec, 0);
        tilePos.y = llList2Float(tileVec, 1);
        tilePos.z = llList2Float(tileVec, 2);
        llRezObject("[K] Holo Tile",tilePos,ZERO_VECTOR,ZERO_ROTATION,llList2Integer(dList,1));
        if(llList2String(dList, 5) == "") return;
        llMessageLinked(LINK_THIS, llList2Integer(dList, 1), llList2String(dList, 5), "bcst");
    }
}

Code: [K] Transmit

This part sends off the messages to the tiles as well as updating the tiles with the messages on local chat. You must configure the BOARD_HEIGHT and BOARD_WIDTH to be identical to the size of the board you generated with the [K] Holo Display Tiler. This part should go into the rezzer as well.

holo_transmit.lsl
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2011 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////
 
//////////////////////////////////////////////////////////
//                   CONFIGURATION                      //
//////////////////////////////////////////////////////////
// Set this to the height of the board.
integer BOARD_HEIGHT = 10;
// Set this to the width of the board.
integer BOARD_WIDTH = 10;
//////////////////////////////////////////////////////////
//                      INTERNALS                       //
//////////////////////////////////////////////////////////
 
key _owner = NULL_KEY;
integer comChannel = 0;
 
default
{
    state_entry() {
        _owner = llGetOwner();
        comChannel = ((integer)("0x"+llGetSubString((string)llGetOwner(),-8,-1)) & 0x3FFFFFFF) ^ 0xBFFFFFFF;
        llListen(0, "", llGetOwner(), "");
    }
    listen(integer channel, string name, key id, string message) {
        integer itra = BOARD_HEIGHT*BOARD_WIDTH;
        string pld = "";
        do {
            pld += (string)(itra+1) + "," + llGetSubString(message, itra, itra) + ",";
        } while(--itra>=0);        
        llWhisper(comChannel, pld);
    }
    link_message(integer sender_num, integer num, string str, key id) {
        if(id != "bcst") return;
        llWhisper(comChannel, (string)num + "," + str);
    }
    on_rez(integer param) {
        _owner = llGetOwner();
    }
    changed(integer change) {
        if(change & CHANGED_OWNER) {
            _owner = llGetOwner();
        }
    }
}