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/downloads/ribbons_Torque3D.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
}
}
}
