diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.pas b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.pas index b3a3693a2..0af6b3a8f 100644 --- a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.pas +++ b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/MatrMlt.pas @@ -13,7 +13,8 @@ begin // Чтение и компиляция .cl файла {$resource MatrMlt.cl} // Засовывает файл MatrMlt.cl внуть .exe - // Вообще лучше прекомпилировать .cl файл (загружать в переменную ProgramCode) + // Вообще лучше прекомпилировать .cl файл + // (загружать в переменную типа ProgramCode) // И сохранять с помощью метода ProgramCode.SerializeTo // А полученный бинарник уже подключать через $resource var code := new ProgramCode(Context.Default, @@ -26,12 +27,12 @@ begin 'Матрица A:'.Println; var A_Matr := MatrRandomReal(MatrW,MatrW,0,1).Println; - Writeln; + Println; var A := new MemorySegment(MatrByteSize); 'Матрица B:'.Println; var B_Mart := MatrRandomReal(MatrW,MatrW,0,1).Println; - Writeln; + Println; var B := new MemorySegment(MatrByteSize); var C := new MemorySegment(MatrByteSize); @@ -39,7 +40,7 @@ begin 'Вектор V1:'.Println; var V1_Arr := ArrRandomReal(MatrW); V1_Arr.Println; - Writeln; + Println; var V1 := new MemorySegment(VecByteSize); var V2 := new MemorySegment(VecByteSize); @@ -51,38 +52,44 @@ begin // Подготовка очередей выполнения var Calc_C_Q := - code['MatrMltMatr'].NewQueue.AddExec2(MatrW, MatrW, // Выделяем ядра в форме квадрата, всего MatrW*MatrW ядер - A.NewQueue.AddWriteArray2(A_Matr), - B.NewQueue.AddWriteArray2(B_Mart), + // Выделяем ядра в форме квадрата, всего MatrW*MatrW ядер + code['MatrMltMatr'].NewQueue.ThenExec2(MatrW, MatrW, + A.NewQueue.ThenWriteArray2(A_Matr), + B.NewQueue.ThenWriteArray2(B_Mart), C, W - ); + // DiscardResult не обязательно, но желательно + // чтобы не использовать результат случайно + ).DiscardResult; var Otp_C_Q := - C.NewQueue.AddReadArray2(A_Matr) + - HPQ(()-> + C.NewQueue.ThenGetArray2&(MatrW, MatrW) + .ThenQuickUse(C_Matr-> begin 'Матрица С = A*B:'.Println; - A_Matr.Println; - Writeln; - end); + C_Matr.Println; + Println; + end).DiscardResult; var Calc_V2_Q := - code['MatrMltVec'].NewQueue.AddExec1(MatrW, + code['MatrMltVec'].NewQueue.ThenExec1(MatrW, C, - V1.NewQueue.AddWriteArray1(V1_Arr), + V1.NewQueue.ThenWriteArray1(V1_Arr), V2, W - ); + ).DiscardResult; var Otp_V2_Q := - V2.NewQueue.AddReadArray1(V1_Arr) + - HPQ(()-> + V2.NewQueue.ThenGetArray1& + .ThenQuickUse(V2_Arr-> begin 'Вектор V2 = C*V1:'.Println; - V1_Arr.Println; - Writeln; - end); + V2_Arr.Println; + Println; + // Единственный DiscardResult, меняющий поведение очереди: + // С ним не выделяются ресурсы на то, чтобы передать V2_Arr + // Из результата ThenGetArray1 в результат SyncInvoke + end).DiscardResult; // Выполнение всего и сразу асинхронный вывод @@ -95,6 +102,10 @@ begin ); except - on e: Exception do Writeln(e); // Эта строчка позволяет выводить всю ошибку, если при выполнении Context.SyncInvoke возникла ошибка + // except позволяет получать список ошибку, + // возникшую при выполнении SyncInvoke + on ae: System.AggregateException do + foreach var e in ae.InnerExceptions do + Println(e); end; end. \ No newline at end of file diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas index b437e9432..d94426506 100644 --- a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas +++ b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas @@ -13,7 +13,7 @@ var A := new CLArray(10); prog['TEST'].Exec1(10, // Используем 10 ядер // Заполняем весь массив значениями (1), прямо перед выполнением - A.NewQueue.AddFillValue(1) + A.NewQueue.ThenFillValue(1) ); diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.pas b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.pas index b7a91d687..2ca988cb9 100644 --- a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.pas +++ b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Игра жизнь/Игра жизнь.pas @@ -43,14 +43,14 @@ try var Q_1Step := code['CalcStep'] .NewQueue - .AddExec2(W,W, + .ThenExec2(W,W, B, B_temp, W ) + - B.NewQueue.AddCopyFrom(B_temp) + B.NewQueue.ThenCopyFrom(B_temp) ; var Q_Otp := B.NewQueue - .AddGetArray2&(W,W) + .ThenGetArray2&(W,W) .ThenUse(field-> begin // Если уже слишком далеко вперёд насчитали - можно немного отдохнуть diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas index 37e9083a9..6fdd04846 100644 --- a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas +++ b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas @@ -15,7 +15,7 @@ begin prog['TEST'].Exec1(10, // Используем 10 ядер - A.NewQueue.AddFillValue(1) + A.NewQueue.ThenFillValue(1) ); diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/!Крутящийся треугольник/Крутящийся треугольник.pas b/InstallerSamples/OpenGL и OpenCL/OpenGL/!Крутящийся треугольник/Крутящийся треугольник.pas deleted file mode 100644 index 31d8fff70..000000000 --- a/InstallerSamples/OpenGL и OpenCL/OpenGL/!Крутящийся треугольник/Крутящийся треугольник.pas +++ /dev/null @@ -1,172 +0,0 @@ -{$reference System.Windows.Forms.dll} -{$reference System.Drawing.dll} - -// Данный пример демонстрирует запуск простейшей программы с модулем OpenGL -// Примите во внимание, что методы из gl_gdi. - могут служить только временной заменой в серьёзной программе -// (По крайней мере в данной версии. В будущем, возможно, gl_gdi будет улучшено) -// Они использованы тут, чтоб пример был проще - -uses System.Windows.Forms; -uses System; -uses OpenGL; - -uses Common in '..\Common'; - -{$apptype windows} // убираем консоль - -const dy = -Sin(Pi / 6) / 2; - -begin - - // Создаём и настраиваем окно - var f := new Form; - f.StartPosition := FormStartPosition.CenterScreen; - f.ClientSize := new System.Drawing.Size(500, 500); - f.FormBorderStyle := FormBorderStyle.Fixed3D; - // Если окно закрылось - надо сразу завершить программу - f.Closed += (o,e)->Halt(); - - // Настраиваем поверхность рисования - var hdc := gl_gdi.InitControl(f); - - // Настраиваем перерисовку - gl_gdi.SetupControlRedrawing(f, hdc, EndFrame-> - begin - - {$region Настройка глобальных параметров OpenGL} - - // При создании экземпляра OpenGL.gl инициализируются некоторые функции - // Это необходимо для всех функций из OpenGL1.2 и выше, потому что они локальны для контекста OpenGL - gl := new OpenGL.gl; - - {$endregion Настройка глобальных параметров OpenGL} - - {$region Инициализация переменных} - - var vertex_pos_buffer: gl_buffer; - gl.CreateBuffers(1, vertex_pos_buffer); - gl.NamedBufferData( - vertex_pos_buffer, - new IntPtr(3*sizeof(Vec2f)), - ArrGen(3, i-> - begin - var rot := i * Pi * 2 / 3; - - Result := new Vec2f( - Sin(rot), - Cos(rot) + dy - ); - - end), - VertexBufferObjectUsage.STATIC_DRAW - ); - - var vertex_clr_buffer: gl_buffer; - gl.CreateBuffers(1, vertex_clr_buffer); - gl.NamedBufferData( - vertex_clr_buffer, - new IntPtr(3*sizeof(Vec3f)), - new Vec3f[]( - new Vec3f(1,0,0), - new Vec3f(0,1,0), - new Vec3f(0,0,1) - ), - VertexBufferObjectUsage.STATIC_DRAW - ); - - var element_buffer: gl_buffer; - gl.CreateBuffers(1, element_buffer); - gl.NamedBufferData( - element_buffer, - new IntPtr(3*sizeof(byte)), - new byte[]( - 0,1,2 - ), - VertexBufferObjectUsage.STATIC_DRAW - ); - - var vertex_shader := InitShader('Крутящийся треугольник.vert', ShaderType.VERTEX_SHADER); - - var sprog := InitProgram(vertex_shader{, другие_шейдеры}); - - var uniform_rot_k := gl.GetUniformLocation(sprog, 'rot_k'); - - var attribute_position := gl.GetAttribLocation(sprog, 'position'); - var attribute_color := gl.GetAttribLocation(sprog, 'color'); - - var t := new Stopwatch; - t.Start; - - {$endregion Инициализация переменных} - - // Для поиска, где возникла ошибка -// var RaiseIfError := procedure-> -// begin -// -// // получаем тип последней ошибки -// var err := gl.GetError; -// // и если ошибка есть - выводим её -// if err<>ErrorCode.NO_ERROR then raise new System.Exception(err.ToString); -// -// end; - - while true do - begin - // очищаем окно в начале перерисовки - gl.Clear(ClearBufferMask.COLOR_BUFFER_BIT); - - - - gl.UseProgram(sprog); - - gl.Uniform1f(uniform_rot_k, Cos( t.Elapsed.Ticks * 0.0000002 ) ); - - gl.BindBuffer(BufferTarget.ARRAY_BUFFER, vertex_pos_buffer); - gl.VertexAttribPointer( - attribute_position, - 2, - VertexAttribPointerType.FLOAT, - false, - 8, - IntPtr.Zero - ); - gl.EnableVertexAttribArray(attribute_position); - - gl.BindBuffer(BufferTarget.ARRAY_BUFFER, vertex_clr_buffer); - gl.VertexAttribPointer( - attribute_color, - 3, - VertexAttribPointerType.FLOAT, - false, - 12, - IntPtr.Zero - ); - gl.EnableVertexAttribArray(attribute_color); - - gl.BindBuffer(BufferTarget.ELEMENT_ARRAY_BUFFER, element_buffer); - gl.DrawElements( - PrimitiveType.TRIANGLES, - 3, - DrawElementsType.UNSIGNED_BYTE, - IntPtr.Zero - ); - - gl.DisableVertexAttribArray(attribute_position); - gl.DisableVertexAttribArray(attribute_color); - - - - // получаем тип последней ошибки - var err := gl.GetError; - // и если ошибка есть - выводим её - if err<>ErrorCode.NO_ERROR then Writeln(err); - - gl.Finish; - // EndFrame меняет местами буферы и ждёт vsync - EndFrame; - end; - - end); - - Application.Run(f); -end. \ No newline at end of file diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.pas b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.pas new file mode 100644 index 000000000..1ee156c5e --- /dev/null +++ b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.pas @@ -0,0 +1,149 @@ +{$reference System.Windows.Forms.dll} +{$reference System.Drawing.dll} + +// Данный пример демонстрирует запуск простейшей программы с модулем OpenGL +// Примите во внимание, что модуль OpenGLABC будет сильно переделан +// Его текущее содержимое может служить только временной заменой в серьёзной программе +// Он использованы тут, чтобы пример был проще + +uses System.Windows.Forms; +uses System; +uses OpenGL; +uses OpenGLABC; + +uses Common in '..\Common'; + +{$apptype windows} // убираем консоль + +const dy = -Sin(Pi / 6) / 2; + +procedure RedrawProc(pl: PlatformLoader; EndFrame: ()->()); +begin + + {$region Настройка глобальных параметров OpenGL} + + // При создании экземпляра OpenGL.gl в память загружаются адреса функций OpenGL + // Это необходимо для функций из OpenGL, потому что они локальны для контекста OpenGL + // Переменная pl указывает как надо загружать адреса + gl := new OpenGL.gl(pl); + + {$endregion Настройка глобальных параметров OpenGL} + + {$region Инициализация переменных} + + var sprog := InitProgram( + InitShader('Крутящийся треугольник.vert', ShaderType.VERTEX_SHADER) + {, другие_шейдеры}); + gl.UseProgram(sprog); + + var uniform_rot_k := gl.GetUniformLocation(sprog, 'rot_k'); + + // Значения, которые будут передаваться в атрибут "position" в шейдере + begin + var vertex_pos_buffer: gl_buffer; + gl.CreateBuffers(1, vertex_pos_buffer); + gl.NamedBufferData( + vertex_pos_buffer, + new IntPtr(3*sizeof(Vec2f)), + ArrGen(3, i-> + begin + var rot := i * Pi * 2 / 3; + + Result := new Vec2f( + Sin(rot), + Cos(rot) + dy + ); + + end), + VertexBufferObjectUsage.STATIC_DRAW + ); + var attribute_position := gl.GetAttribLocation(sprog, 'position'); + // Оставляем всё настроенным и привязанным + // В данном случае можно, потому что шейдерная программа одна + gl.VertexAttribFormat(attribute_position, 2,VertexAttribType.FLOAT, false, 0); + gl.BindVertexBuffer(attribute_position, vertex_pos_buffer, IntPtr.Zero, sizeof(Vec2f)); + gl.EnableVertexAttribArray(attribute_position); + end; + + // Значения, которые будут передаваться в атрибут "color" в шейдере + begin + var vertex_clr_buffer: gl_buffer; + gl.CreateBuffers(1, vertex_clr_buffer); + gl.NamedBufferData( + vertex_clr_buffer, + new IntPtr(3*sizeof(Vec3f)), + | + new Vec3f(1,0,0), + new Vec3f(0,1,0), + new Vec3f(0,0,1) + |, + VertexBufferObjectUsage.STATIC_DRAW + ); + var attribute_color := gl.GetAttribLocation(sprog, 'color'); + gl.VertexAttribFormat(attribute_color, 3,VertexAttribType.FLOAT, false, 0); + gl.BindVertexBuffer(attribute_color, vertex_clr_buffer, IntPtr.Zero, sizeof(Vec3f)); + gl.EnableVertexAttribArray(attribute_color); + end; + + var t := new Stopwatch; + t.Start; + + {$endregion Инициализация переменных} + + // Для поиска, где возникла ошибка +// var RaiseIfError := procedure-> +// begin +// +// // получаем тип последней ошибки +// var err := gl.GetError; +// // и если ошибка есть - выводим её +// if err<>ErrorCode.NO_ERROR then raise new System.Exception(err.ToString); +// +// end; + + while true do + begin + // очищаем окно в начале перерисовки + gl.Clear(ClearBufferMask.COLOR_BUFFER_BIT); + + + + gl.Uniform1f(uniform_rot_k, Cos( t.Elapsed.Ticks * 0.0000002 ) ); + + // Рисуем треугольники из всего 3 вершин (то есть получится 1 треугольник) + // Для каждой вершины берём 1 значение из vertex_pos_buffer и 1 из vertex_clr_buffer + gl.DrawArrays(PrimitiveType.TRIANGLES, 0,3); + + + + // получаем тип последней ошибки + var err := gl.GetError; + // и если ошибка есть - выводим её + if err<>ErrorCode.NO_ERROR then Writeln(err); + + gl.Finish; + // EndFrame меняет местами буферы и ждёт vsync + EndFrame; + end; + +end; + +begin + + // Создаём и настраиваем окно + var f := new Form; + f.StartPosition := FormStartPosition.CenterScreen; + f.ClientSize := new System.Drawing.Size(500, 500); + f.FormBorderStyle := FormBorderStyle.Fixed3D; + // Если окно закрылось - надо сразу завершить программу + // Иначе поток перерисовки продолжит пытаться рисовать на закрытом окне + f.Closed += (o,e)->Halt(); + + // Настраиваем поверхность рисования + var hdc := OpenGLABC.gl_gdi.InitControl(f); + + // Настраиваем перерисовку + f.Load += (o,e)->OpenGLABC.RedrawHelper.SetupRedrawThread(hdc, RedrawProc); + + Application.Run(f); +end. \ No newline at end of file diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/!Крутящийся треугольник/Крутящийся треугольник.vert b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.vert similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/!Крутящийся треугольник/Крутящийся треугольник.vert rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/!Крутящийся треугольник/Крутящийся треугольник.vert diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/Common.pas b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Common.pas similarity index 98% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/Common.pas rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/Common.pas index 1ea41354f..e04ef380c 100644 --- a/InstallerSamples/OpenGL и OpenCL/OpenGL/Common.pas +++ b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Common.pas @@ -3,7 +3,7 @@ uses System; uses OpenGL; -var gl: OpenGL.gl; +var gl: OpenGL.gl; {$region Shader} diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Empty.vert b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Empty.vert similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Empty.vert rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Empty.vert diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Mandelbrot.frag b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Mandelbrot.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Mandelbrot.frag rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Mandelbrot.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/SinglePointToScreen.geom b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/SinglePointToScreen.geom similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/SinglePointToScreen.geom rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/SinglePointToScreen.geom diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Волны.frag b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Волны.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Волны.frag rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Волны.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Минимум расстояний.frag b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Минимум расстояний.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Минимум расстояний.frag rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Минимум расстояний.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Спирали.frag b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Спирали.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Спирали.frag rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Спирали.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Сумма расстояний.frag b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Сумма расстояний.frag similarity index 100% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Сумма расстояний.frag rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Сумма расстояний.frag diff --git a/InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Точки.pas b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Точки.pas similarity index 95% rename from InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Точки.pas rename to InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Точки.pas index fbfd44836..559e628b6 100644 --- a/InstallerSamples/OpenGL и OpenCL/OpenGL/Точки на поле/Точки.pas +++ b/InstallerSamples/OpenGL и OpenCL/OpenGLABC/Точки на поле/Точки.pas @@ -14,6 +14,7 @@ uses System.Windows.Forms; uses System; uses OpenGL; +uses OpenGLABC; uses Common in '..\Common'; @@ -164,9 +165,9 @@ begin end; {$endregion Управление} - gl_gdi.SetupControlRedrawing(f, gl_gdi.InitControl(f), EndFrame-> + OpenGLABC.RedrawHelper.SetupRedrawThread(OpenGLABC.gl_gdi.InitControl(f), (pl, EndFrame)-> try - gl := new OpenGL.gl; + gl := new OpenGL.gl(pl); var sprog: gl_program; var last_fragment_shader := -1; @@ -174,7 +175,7 @@ begin var uniform_point_count := 0; var buffer_points: gl_buffer; gl.CreateBuffers(1, buffer_points); - gl.BindBufferBase(BufferTarget.SHADER_STORAGE_BUFFER, 0, buffer_points); + gl.BindBufferBase(BufferTarget.SHADER_STORAGE_BUFFER, 0, buffer_points); var uniform_aspect := 1; var uniform_scale := 2; @@ -184,7 +185,7 @@ begin // var buffer_temp: gl_buffer; // gl.CreateBuffers(1, buffer_temp); // gl.NamedBufferData(buffer_temp, new IntPtr(3*sizeof(real)), IntPtr.Zero, VertexBufferObjectUsage.DYNAMIC_READ); -// gl.BindBufferBase(BufferTarget.SHADER_STORAGE_BUFFER, 1, buffer_temp); +// gl.BindBufferBase(BufferTarget.SHADER_STORAGE_BUFFER, 1, buffer_temp); var timings_max_count := 30; var timings := new Queue(timings_max_count); @@ -198,10 +199,10 @@ begin begin var w_size := f.ClientSize; - gl.Viewport(0,0, w_size.Width,w_size.Height); - need_set_resize_ev := true; - - camera.aspect := w_size.Width/w_size.Height; + gl.Viewport(0,0, w_size.Width,w_size.Height); + need_set_resize_ev := true; + + camera.aspect := w_size.Width/w_size.Height; end; if last_fragment_shader<>curr_fragment_shader then diff --git a/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html b/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html index 17e934ab9..1339bce05 100644 --- a/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html +++ b/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html @@ -293,11 +293,13 @@ const on_start_folder = (folder_name, root_page)=>{ } currently_loading_folder = res; - if (root_page) { + if (root_folder !== res) { res.content_ref = root_page; root_page.tree_obj = res; document.getElementById("page-display-container-body").append(root_page); - if (!res.auto_fill_content) fix_links(root_page); + add_to_switch_list(root_page); + if (!res.auto_fill_content) + fix_links(root_page); } } @@ -334,6 +336,7 @@ const on_page_added = (page)=>{ currently_loading_folder.pages.push(res); define_page_with_path(res.path, page); + add_to_switch_list(page); fix_links(page); if (!selected_page && !document.location.hash) select_page(page); @@ -465,13 +468,16 @@ const define_broken_lnk = (path, source, fixer)=>{ }); } -const fix_links = (page)=>{ +const add_to_switch_list = (o)=>{ - if (globalThis.last_page) { - page.page_l = last_page; - last_page.page_r = page; + if (add_to_switch_list.last_o) { + o.page_l = add_to_switch_list.last_o; + add_to_switch_list.last_o.page_r = o; } - last_page = page; + add_to_switch_list.last_o = o; + +} +const fix_links = (page)=>{ for (let lnk of page.getElementsByTagName('a')) { diff --git a/InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html b/InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html index 38ca53538..a25664ed9 100644 --- a/InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html +++ b/InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html @@ -293,11 +293,13 @@ const on_start_folder = (folder_name, root_page)=>{ } currently_loading_folder = res; - if (root_page) { + if (root_folder !== res) { res.content_ref = root_page; root_page.tree_obj = res; document.getElementById("page-display-container-body").append(root_page); - if (!res.auto_fill_content) fix_links(root_page); + add_to_switch_list(root_page); + if (!res.auto_fill_content) + fix_links(root_page); } } @@ -334,6 +336,7 @@ const on_page_added = (page)=>{ currently_loading_folder.pages.push(res); define_page_with_path(res.path, page); + add_to_switch_list(page); fix_links(page); if (!selected_page && !document.location.hash) select_page(page); @@ -465,13 +468,16 @@ const define_broken_lnk = (path, source, fixer)=>{ }); } -const fix_links = (page)=>{ +const add_to_switch_list = (o)=>{ - if (globalThis.last_page) { - page.page_l = last_page; - last_page.page_r = page; + if (add_to_switch_list.last_o) { + o.page_l = add_to_switch_list.last_o; + add_to_switch_list.last_o.page_r = o; } - last_page = page; + add_to_switch_list.last_o = o; + +} +const fix_links = (page)=>{ for (let lnk of page.getElementsByTagName('a')) { @@ -1024,12 +1030,12 @@ Writeln('='*30); - - - - - -