-----------------------------------------------------
-----------------------------Hydraulika--------------
-----------------------------------------------------
-----------------------------------------------------
------------------Author: MajsteR--------------------
-----------------------------------------------------
----© Copyright 2011 MajsteR All Rights Reserved.----
-----------------------------------------------------
-------------- www.majster-mod.xaa.pl ---------------
-----------------------------------------------------
-----------------------------------------------------
--#################################################################################
hydraulika = {};
--#################################################################################
function hydraulika.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(Steerable, specializations);
end;
--#################################################################################
function hydraulika:load(savegame)
    
    self.setHydraulicDirection = SpecializationUtil.callSpecializationsFunction("setHydraulicDirection");
    
    local hydraulicsCount = Utils.getNoNil(getXMLInt(xmlFile, "vehicle.hydraulics#count"), 0);    
    self.hydraulics = {};    
    for i=1, hydraulicsCount do
        local hydraulicName = string.format("vehicle.hydraulics.hydraulic%d", i);        
        self.hydraulics[i] = {};        
        self.hydraulics[i].node = Utils.indexToObject(self.components, getXMLString(xmlFile, hydraulicName .. "#index"));
        self.hydraulics[i].punch = Utils.indexToObject(self.components, getXMLString(xmlFile, hydraulicName .. "#punch"));
        self.hydraulics[i].translationPunch = Utils.indexToObject(self.components, getXMLString(xmlFile, hydraulicName .. "#punchFixpoint"));
        self.hydraulics[i].fixPoint = Utils.indexToObject(self.components, getXMLString(xmlFile, hydraulicName .. "#fixpoint"));    
        local xUp, yUp, zUp = Utils.getVectorFromString(Utils.getNoNil(getXMLString(xmlFile, hydraulicName .. "#upVectors"),"0 1 0"));
        self.hydraulics[i].upVectors = {xUp, yUp, zUp};
        
        local ax, ay, az;        
        if self.hydraulics[i].punch ~= nil then
            ax, ay, az = getWorldTranslation(self.hydraulics[i].punch);
        else
            ax, ay, az = getWorldTranslation(self.hydraulics[i].node);
        end;
        if self.hydraulics[i].translationPunch ~= nil then
            local bx, by, bz = getWorldTranslation(self.hydraulics[i].translationPunch);        
            self.hydraulics[i].punchDistance = Utils.vector3Length(ax-bx, ay-by, az-bz);
        end;
    end;
    
    self.setHydraulicTime = 30;
end;
--#################################################################################
function hydraulika:update(dt)
if self:getIsActive() then            
        self.setHydraulicTime = 30;    
    end;

    if self.setHydraulicTime > 0 then
        for k,v in pairs(self.hydraulics) do 
            self:setHydraulicDirection(k);
        end;
        self.setHydraulicTime = self.setHydraulicTime - 1;
    end;    
     
end;        
--#################################################################################        
function hydraulika:draw()

end;
--#################################################################################
function hydraulika:onEnter()
    
end;
--#################################################################################
function hydraulika:onLeave()

end;
--#################################################################################
function hydraulika:delete()
end;
--#################################################################################
function hydraulika:mouseEvent(posX, posY, isDown, isUp, button)
end;
function hydraulika:keyEvent(unicode, sym, modifier, isDown)
end;
--#################################################################################
function hydraulika:setHydraulicDirection(index)

    local hydraulic = self.hydraulics[index];

    if hydraulic.fixPoint ~= nil then
        local ax, ay, az = getWorldTranslation(hydraulic.node);
        local bx, by, bz = getWorldTranslation(hydraulic.fixPoint);
        local x, y, z = worldDirectionToLocal(getParent(hydraulic.node), bx-ax, by-ay, bz-az);
        local xUp, yUp, zUp = unpack(hydraulic.upVectors);
        setDirection(hydraulic.node, x, y, z, xUp, yUp, zUp);
        if hydraulic.punch ~= nil then
            local distance = Utils.vector3Length(ax-bx, ay-by, az-bz);
            setTranslation(hydraulic.punch, 0, 0, distance-hydraulic.punchDistance);
        end;
    end;
end;
--#################################################################################
function hydraulika:validateAttacherJoint(implement, jointDesc, dt)
    return true;
end;
