90% of the code comes from Tim at MaxGaming for TGE/A, 10% from myself to get it working in Torque3D.
http://www.yorkshirerifles.com/download ... rque3D.zip
Make sure you've got ribbon.cpp/h and ribbonNode.cpp/h in T3D/fx and the ribbon shaders basicRibbonShaderP/V.hlsl in shaders/ribbons.
ribbons.cs goes in art/datablocks, don't forget to exec it in art/datablocks/datablockExec.cs.
ribbons.cs
new ShaderData( basicRibbonShader ) { DXVertexShaderFile = "shaders/ribbons/basicRibbonShaderV.hlsl"; DXPixelShaderFile = "shaders/ribbons/basicRibbonShaderP.hlsl"; pixVersion = 2.0; }; //custom material//////////////////////////////////// singleton CustomMaterial( basicRibbonGlow ) { shader = basicRibbonShader; version = 2.0; emissive[0] = true; glow[0] = true; doubleSided = false; translucent = true; BlendOp = AddAlpha; translucentBlendOp = AddAlpha; preload = false;//yorks }; //ribbon data//////////////////////////////////////// datablock RibbonData(basicRibbon) { category = "Misc"; size[0] = 0.8; color[0] = "1.0 0.3 0.0 1.0"; position[0] = 1.0; size[1] = 0; color[1] = "1.0 0 0.0 0.0"; position[1] = 0.0; RibbonLength = 6; fadeAwayStep = 0.25; RibbonMaterial = basicRibbonGlow; }; datablock RibbonData(longRibbon) { size[0] = 0.5; color[0] = "0.6 0.7 0.8 1.0"; position[0] = 1.0; size[1] = 0.25; color[1] = "0.6 0.7 0.8 0.5"; position[1] = 0.5; size[2] = 0; color[2] = "0.6 0.7 0.8 0.0"; position[2] = 0.0; RibbonLength = 40; fadeAwayStep = 0.25; UseFadeOut = true; RibbonMaterial = basicRibbonGlow; }; datablock RibbonData(amberRibbon) { size[0] = 0.2; color[0] = "1.0 0.65 0.1 1.0"; position[0] = 1.0; size[1] = 0; color[1] = "1.0 0.65 0.1 0.0"; position[1] = 0.0; RibbonLength = 30; fadeAwayStep = 0.25; UseFadeOut = true; RibbonMaterial = basicRibbonGlow; }; datablock RibbonData(greenRibbon) { size[0] = 0.2; color[0] = "0.0 1.0 0.0 1.0"; position[0] = 1.0; size[1] = 0; color[1] = "0.0 1.0 0.0 0.0"; position[1] = 0.0; RibbonLength = 30; fadeAwayStep = 0.25; UseFadeOut = true; RibbonMaterial = basicRibbonGlow; }; datablock RibbonNodeData(DefaultRibbonNodeData) { timeMultiple = 1.0; }; function createRibbon(%emitter, %pos) { %r = new RibbonNode() { datablock = DefaultRibbonNodeData; emitter = %emitter; position = %pos; }; if(isObject(MissionCleanup)) MissionCleanup.add(%r); return %r; }scripts/server/weapon.cs weaponImage::onFire function at the end.
// Create the projectile object %p = new (%this.projectileType)() { dataBlock = %this.projectile; initialVelocity = %muzzleVelocity; initialPosition = %obj.getMuzzlePoint(%slot); sourceObject = %obj; sourceSlot = %slot; client = %obj.client; sourceClass = %obj.getClassName(); }; MissionCleanup.add(%p); //yorks we now have a projectile so let's attach a ribbon to it %ribbon = createRibbon(longRibbon, %obj.getMuzzlePoint(%slot)); %p.mountObject(%ribbon, 0); } }Next lets add some ribbons to the Cheetah. scripts/server/cheetah.cs, onAdd function
// Mount the brake lights %obj.mountObject(%obj.rightBrakeLight, %this.rightBrakeSlot); %obj.mountObject(%obj.leftBrakeLight, %this.leftBrakeSlot); //yorks add ribbons! %ribbon1 = createRibbon(amberRibbon, %obj.getTransform()); %ribbon2 = createRibbon(greenRibbon, %obj.getTransform()); %obj.mountObject(%ribbon1, %this.rightBrakeSlot); %obj.mountObject(%ribbon2, %this.leftBrakeSlot);And make sure we don't get console spam when the vehicle is removed.
scripts/server/vehicle.cs VehicleData::onRemove function
function VehicleData::onRemove(%this, %obj) { //echo("\c4VehicleData::onRemove("@ %this.getName() @", "@ %obj.getClassName() @")"); // if there are passengers/driver, kick them out for(%i = 0; %i < %obj.getDatablock().numMountPoints; %i++) { if (%obj.getMountNodeObject(%i)) { %passenger = %obj.getMountNodeObject(%i); if(isMethod(%passenger, doDismount))//yorks in %passenger.getDataBlock().doDismount(%passenger, true); else//yorks in %passenger.delete();//yorks in for ribbons etc } } }
