parametric version of 'smoke' variation... got to test
This commit is contained in:
		
							
								
								
									
										139
									
								
								2.10/Source/varSmoke2.pas
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								2.10/Source/varSmoke2.pas
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,139 @@
 | 
			
		||||
unit varSmoke2;
 | 
			
		||||
 | 
			
		||||
interface
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  BaseVariation, XFormMan;
 | 
			
		||||
 | 
			
		||||
const
 | 
			
		||||
  var_a_name='smoke2_amp';
 | 
			
		||||
  var_f_name='smoke2_freq';
 | 
			
		||||
 | 
			
		||||
type
 | 
			
		||||
  TVariationSmoke2 = class(TBaseVariation)
 | 
			
		||||
  private
 | 
			
		||||
    a, f: double;
 | 
			
		||||
 | 
			
		||||
  public
 | 
			
		||||
    constructor Create;
 | 
			
		||||
 | 
			
		||||
    class function GetName: string; override;
 | 
			
		||||
    class function GetInstance: TBaseVariation; override;
 | 
			
		||||
 | 
			
		||||
    class function GetNrVariables: integer; override;
 | 
			
		||||
    class function GetVariableNameAt(const Index: integer): string; override;
 | 
			
		||||
 | 
			
		||||
    function SetVariable(const Name: string; var value: double): boolean; override;
 | 
			
		||||
    function GetVariable(const Name: string; var value: double): boolean; override;
 | 
			
		||||
 | 
			
		||||
    procedure CalcFunction; override;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
implementation
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  math;
 | 
			
		||||
 | 
			
		||||
// TVariationSmoke2
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
constructor TVariationSmoke2.Create;
 | 
			
		||||
begin
 | 
			
		||||
  a := random;
 | 
			
		||||
  f := 4*random;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure TVariationSmoke2.CalcFunction;
 | 
			
		||||
{$if false}
 | 
			
		||||
begin
 | 
			
		||||
  FPx^ := FPx^ + vvar*(ftx^ + a*sin(fty^*f) );
 | 
			
		||||
  FPy^ := FPy^ + vvar*(fty^ + a*sin(ftx^*f) );
 | 
			
		||||
{$else}
 | 
			
		||||
asm
 | 
			
		||||
    fld     qword ptr [eax + vvar]
 | 
			
		||||
    fld     qword ptr [eax + a]
 | 
			
		||||
    mov     ecx, [eax + FTy]
 | 
			
		||||
    fld     qword ptr [ecx]
 | 
			
		||||
    fld     qword ptr [eax + f]
 | 
			
		||||
    mov     ecx, [eax + FTx]
 | 
			
		||||
    fld     qword ptr [ecx]
 | 
			
		||||
    fld     st(2)
 | 
			
		||||
    fmul    st, st(2)
 | 
			
		||||
    fsin
 | 
			
		||||
    fmul    st, st(4)
 | 
			
		||||
    fadd    st, st(1)
 | 
			
		||||
    fmul    st, st(5)
 | 
			
		||||
    mov     ecx, [eax + FPx]
 | 
			
		||||
    fadd    qword ptr [ecx]
 | 
			
		||||
    fstp    qword ptr [ecx]
 | 
			
		||||
    fmulp
 | 
			
		||||
    fsin
 | 
			
		||||
    fmulp   st(2), st
 | 
			
		||||
    faddp
 | 
			
		||||
    fmulp
 | 
			
		||||
    mov     ecx, [eax + FPy]
 | 
			
		||||
    fadd    qword ptr [ecx]
 | 
			
		||||
    fstp    qword ptr [ecx]
 | 
			
		||||
    fwait
 | 
			
		||||
{$ifend}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
class function TVariationSmoke2.GetInstance: TBaseVariation;
 | 
			
		||||
begin
 | 
			
		||||
  Result := TVariationSmoke2.Create;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
class function TVariationSmoke2.GetName: string;
 | 
			
		||||
begin
 | 
			
		||||
  Result := 'smoke2';
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
class function TVariationSmoke2.GetVariableNameAt(const Index: integer): string;
 | 
			
		||||
begin
 | 
			
		||||
  case Index of
 | 
			
		||||
  0: Result := var_a_name;
 | 
			
		||||
  1: Result := var_f_name;
 | 
			
		||||
  else
 | 
			
		||||
    Result := '';
 | 
			
		||||
  end
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
function TVariationSmoke2.SetVariable(const Name: string; var value: double): boolean;
 | 
			
		||||
begin
 | 
			
		||||
  Result := False;
 | 
			
		||||
  if Name = var_a_name then begin
 | 
			
		||||
    a := Value;
 | 
			
		||||
    Result := True;
 | 
			
		||||
  end else if Name = var_f_name then begin
 | 
			
		||||
    f := Value;
 | 
			
		||||
    Result := True;
 | 
			
		||||
  end
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
class function TVariationSmoke2.GetNrVariables: integer;
 | 
			
		||||
begin
 | 
			
		||||
  Result := 2;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
function TVariationSmoke2.GetVariable(const Name: string; var value: double): boolean;
 | 
			
		||||
begin
 | 
			
		||||
  Result := False;
 | 
			
		||||
  if Name = var_a_name then begin
 | 
			
		||||
    Value := a;
 | 
			
		||||
    Result := True;
 | 
			
		||||
  end else if Name = var_f_name then begin
 | 
			
		||||
    Value := f;
 | 
			
		||||
    Result := True;
 | 
			
		||||
  end
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
initialization
 | 
			
		||||
  RegisterVariation(TVariationSmoke2);
 | 
			
		||||
end.
 | 
			
		||||
		Reference in New Issue
	
	Block a user