// Name        : Lesson 06 - 2axis / Двусторонняя стрелка.
// Version     : 19 dec 2012
// Author      : LODka3D
// Discription : Урок 06 Делаем стрелку у которой кончик всегда остаётся
//                одного и того же размера.
//

{$INCLUDE 'func-demo1.dws'}
{$INCLUDE 'vectorgeometry.dws'}

procedure LODPCreatePrimitive;
var
  p1, p2   : Integer;
  f1, len1 : Float;
  vSc1     : TVector;
begin
  
    // Добавляем одну стрелку.
  p1  := StrToInt(LOD('GetPPointsCount'));
  AddArrow;
  p2  := StrToInt(LOD('GetPPointsCount')) -1;
    // Масштабируем стрелку, поворачиваем и сдвигаем в нужное положение.
  LOD('PPtsScaleVector', '(0.5;0.5;0.5)',     IntToStr(p1), IntToStr(p2));
  LOD('PPtsTransform', '(0;0;1;0; 0;-1;0;0)', IntToStr(p1), IntToStr(p2));
  LOD('PPtsAddVector', '(0.25;0;0)',          IntToStr(p1), IntToStr(p2));

    // Читаем размер конца стрелки установленный пользователем.
  len1 := 0.25 -StrToFloat(LOD('GetPControl', 'HeadL'));
    // Читаем масштаб примитива который установил пользователь.
  vSc1 := StrToVector(LOD('GetPPreviewScale'));

    // Чтобы кончик оставался всегда одних и тех же размеров, изменение
    //  масштаба нужно компенсировать сдвигом и масштабированием точек
    //  из которых состоит кончик стрелки ( от p1 +1 до p1 +16 ).
  LOD('PPtsAddVector', VectorToStr( VectorMake((vSc1[0] -1)*0.5 +len1, 0, 0) ),
    IntToStr(p1 +1), IntToStr(p1 +16));
  if vSc1[0] <> 0 then f1 := 1/vSc1[0] else f1 := 0;
  LOD('PPtsScaleVector', VectorToStr(VectorMake(f1, 1, 1)),
    IntToStr(p1 +1), IntToStr(p1 +16));
  
  if LOD('GetPControl', 'TWoDir') = '1' then begin 
    // Пользователь выбрал две стрелки.

      // Добавляем вторую стрелку.
    p1  := StrToInt(LOD('GetPPointsCount'));
    AddArrow;
    p2  := StrToInt(LOD('GetPPointsCount')) -1;
      // Масштабируем стрелку, поворачиваем и сдвигаем в нужное положение.
    LOD('PPtsScaleVector', '(0.5;0.5;0.5)',     IntToStr(p1), IntToStr(p2));
    LOD('PPtsTransform', '(0;0;1;0; 0;1;0;0)', IntToStr(p1), IntToStr(p2));
    LOD('PPtsAddVector', '(-0.25;0;0)',          IntToStr(p1), IntToStr(p2));

      // Компенсируем масштабирование изменяя положение точек кончика стрелки.
    LOD('PPtsAddVector', VectorToStr( VectorMake(-(vSc1[0] -1)*0.5 -len1, 0, 0) ),
      IntToStr(p1 +1), IntToStr(p1 +16));
    if vSc1[0] <> 0 then f1 := 1/vSc1[0] else f1 := 0;
    LOD('PPtsScaleVector', VectorToStr(VectorMake(f1, 1, 1)),
      IntToStr(p1 +1), IntToStr(p1 +16));
  end;
end;


procedure LODPCreateControls;
begin
  if LOD('GetLanguage') = '25' then begin
    LOD('AddPControl', 'TwoDir', 'Bool',    '3', 'Двусторонняя', 
                                                     'Стрелки в две стороны.');
    LOD('AddPControl', 'HeadL', 'Float', '0.25', 'Длина конца',    
                                    'Длина головки стрелки.', '0.001', '1000');
  end else begin
    LOD('AddPControl', 'TwoDir', 'Bool',    '3', 'Two dir', 'Two directions.');
    LOD('AddPControl', 'HeadL', 'Float', '0.25', 'Head length', 
                                  'Length of arrow''s head.', '0.001', '1000');
  end;
end;