forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Странное. (http://forum.boolean.name/showthread.php?t=15405)

dsd 27.09.2011 23:45

Ответ: Странное.
 
А ведь не так уж и чудовищно :) По-моему на планеты из споры смахивает.

moka 28.09.2011 00:48

Ответ: Странное.
 
Только как понимаю сама "планета" рендерится как сфера, а не как ландшафт на сфере?

dsd 28.09.2011 01:16

Ответ: Странное.
 
Я не понял, что ты спросил.

У меня есть сфера с относительно равномерно разбросанными по поверхности вершинами. Для каждой точки её координаты есть вектор от центра сферы к этой точке. В текстурных координатах я храню индексы этой точки в массиве в котором карта высот. Карта высот заданна в диапазоне (0,1). Я устанавливаю уровень 0 на карте высот равным 0.25, все значения меньшие это ниже уровня моря. Дальше я вычисляю такое значение: val=1+scale*(massive[u][v]-0.25); где scale это в долях единицы отношение радиуса к высоте ландшафта на сфере.
Потом координаты точки я умножаю на val. Profit...
Это верхний уровень моего генератора ландшафта, нижний будет сложней. Итоговая поверхность как я планирую будет из 128*256*256*256 полигонов из которых видимыми будет 256*256*10. В смысле каждый полигон этой сферы будет дополнительно преобразовываться в искривленную плоскость 256х256 или 128х128 если таки будут артефакты из-за ограничения кол-ва индексов.

moka 28.09.2011 13:48

Ответ: Странное.
 
Почитай: http://vterrain.org/LOD/spherical.html
http://www.zib.de/clasen/download/Sp...Electronic.pdf
Суть в том, что хороший ландшафт, это не статичный набор вершин и трианглов, а динамично адаптируемый, под положение и обзор камеры и детализацию на уровне, чтобы уменьшить количество трианглов, и иметь возможность рисовать большие просторы.
В случае с планетами, то тут используется немного иной подход. Вот когда ты отлетаешь от планеты, ты видишь минимум деталей, планета почти как сфера, когда подлетаешь ближе, там где камера, нужно отрисовывать более детальный ландшафт, это называется LOD (Level of Detail).

Я про то что у тебя твоя планета, подойдёт только для полётов вокруг, или не далеко из атмосферы, т.к. если смотреть ближе, то детализация будет весьма низкой, что не будет "приятно" выглядеть..

dsd 28.09.2011 17:22

Ответ: Странное.
 
Мока, этой сферы на самом деле не будет, только массив 2н х н, я сделал сферой чтобы увидеть то в массиве или не то. Так как результат похож на планету, значит генерация исходных данных происходит корректным образом. А как я собираюсь сделать эти милиарды треугольников не слишком вислыми, я писал выше. А уровень детализации выставляется вообще легко, у меня генератор выдает одинаковую карту высот для любого кол-ва элементов в карте. То есть я в любой момент без особых проблем могу изменить детализацию, изменив в программе всего одно число.

moka 28.09.2011 18:13

Ответ: Странное.
 
Можно на скрины поглядеть?

dsd 28.09.2011 19:09

Ответ: Странное.
 
Пока нет, может через пару недель или позже появится что-нить рабочее или хотя бы не падающее, может вообще не появится.

dsd 01.10.2011 02:33

Ответ: Странное.
 
Генератор камней с разной поверхностью полусфер.

на пробел сделать новый камень, [v] &[b] изменить детализацию меша.

dsd 02.10.2011 13:48

Ответ: Странное.
 

Когда-то в раннем детстве мне на глаза попадалась диаграмма соответствия цветов основного и отраженного света, толи наоборот приятное глазу цветовое соотношение. Мож у кого есть чо достойное почитать по этой теме, желательно на русском языке.

dsd 04.10.2011 15:58

Ответ: Странное.
 
А xCountVertices() сильно ресурсоемкая операция или оно просто читает где-то сохраненое кол-во вертексов для сюрфэйса?
Ну и по классам вопрос: 1000 строк для класса это нормально или следует избегать?

moka 04.10.2011 16:17

Ответ: Странное.
 
Насчёт класса, не нормально, т.к. обычно он должен выполнять только конкретные задачи, если в нём реализовано много разных задач, то это дело нужно разбить на более мелкие.

dsd 04.10.2011 16:23

Ответ: Странное.
 
в нем одна кооонкретная задача :) а уж сколько памяти он отожрет на один объект, мммм...

moka 04.10.2011 16:32

Ответ: Странное.
 
Какая задача, опиши?

dsd 04.10.2011 16:40

Ответ: Странное.
 
Ландшафт :D, может сегодня к ночи сочиню кой-чо :)

moka 04.10.2011 16:40

Ответ: Странное.
 
Не могу представить класс ландшафта на 1000 строк..

dsd 05.10.2011 00:28

Ответ: Странное.
 
Написал какую-то адовую херню, которая отжирает примерно 70 мб памяти, на генерацию позиции уходит 40 мс, вроде. Вроде даже происходит все как планировал, почти.За исключением синхронизации обновления ландшафта от движений камеры. Если память будет уходить такими темпами то мое приложение будет требовать как минимум гиг свободной оперативки :)) На встроенном видео наверно уже сейчас фпс близок к критическому уровню:)

moka 05.10.2011 00:47

Ответ: Странное.
 
В чём прикол тут? Ландшафт генерируется снова и снова?
Если использовать потоки, то будет практически без каких либо лагов.

dsd 05.10.2011 00:50

Ответ: Странное.
 
Ландшафт в каждую большую клетку генерится один и тот же, то есть в дальнейшем мне надо будет сохранять не мир, а то что юзер накликает :)
зы: я больше не люблю массивы и ручное выделение памяти

dsd 07.10.2011 01:02

Ответ: Странное.
 

Нечто отдаленно напоминающее ландшафт с дальним и ближним планом.
У кого сколько фпс? А то у меня появилось ощущение, что так не делают потому что это не по детски жрет ресурсы с посредственным результатом.



moka 07.10.2011 02:01

Ответ: Странное.
 
Как мышкой крутиться в твоих приложениях? А то тупо летать по осям с фиксированным поворотом очень тупо.

dsd 07.10.2011 02:46

Ответ: Странное.
 
Если удерживвать среднюю кнопку мыши появится мауслук.

Nex 07.10.2011 13:31

Ответ: Странное.
 
48-50 фпс. Дерганья при подгрузке ландшафта.

moka 07.10.2011 14:38

Ответ: Странное.
 
Ты пытаешься изобрести LoD ландшафт извратными путями. Это делается на более низком уровне (DX), лучше не трать на подобное время, либо перебирайся на GAPI и тогда уже разрабатывай на самом деле серьёзные вещи.

dsd 07.10.2011 20:05

Ответ: Странное.
 
Цитата:

Сообщение от MoKa (Сообщение 204985)
Это делается на более низком уровне (DX), лучше не трать на подобное время, либо перебирайся на GAPI и тогда уже разрабатывай на самом деле серьёзные вещи.

А как я смогу добавить потом то что напишу в окно хорса? Или это был призыв оставить хорс в покое?

moka 07.10.2011 21:06

Ответ: Странное.
 
Это к тому, что если ты хочешь писать на ксорсе, пиши на нём, но то что ты делаешь, не совсем относится к ксорсу, такое можно делать на чём угодно, толку правда от этого мало. Кроме как разработки самой системы ландшафта и подгрузки используя потоки, но как уже сказал, для этого нужен более низкий доступ к GAPI.

Просто, я не совсем понимаю чем ты занимаешь, это чисто опыт и удовольствие в экспериментах и изучение самого языка, либо это попытка реализовать что-то конкретное? Если второе, то в таком случае, ты это делаешь очень извращённо и не весьма продуктивно, это как пить из бочки и ли забивать гвозди ложкой.

pozitiffcat 07.10.2011 22:11

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 204935)

Нечто отдаленно напоминающее ландшафт с дальним и ближним планом.
У кого сколько фпс? А то у меня появилось ощущение, что так не делают потому что это не по детски жрет ресурсы с посредственным результатом.

А нахрен тебе это надо если это на ксорсе жрет больше ресурсов если же ты бы просто грузил готовый ландшафт из модельки и не парил себе мозг

dsd 07.10.2011 22:23

Ответ: Странное.
 
Цитата:

Сообщение от MoKa (Сообщение 205033)
Если второе, то в таком случае, ты это делаешь очень извращённо и не весьма продуктивно, это как пить из бочки и ли забивать гвозди ложкой.

Мб ты хотел сказать: хлебать щи лаптем?

Вообще я на примере этого пытался научиться использовать классы и вроде как понял, ну кроме ссылок и двоеточий. Плюс в башке более менее выкристализовался алгоритм как получить такой ландшафт. Сейчас я на каждое смещение генерирую данные для всего ландшафта и все пицот тыщ вершин деформирую и обновляю нормали xUpdateN(), что есть плохо, а последние два пункта так и вовсе прискорбно.
Если сочинить алгоритм способный смещать данные на одну строку, то быстродействие вырастет радикально, а разрешение ландшафта в (2048х128)^2 пикселей это ведь круто.

dsd 07.10.2011 22:26

Ответ: Странное.
 
Цитата:

Сообщение от pozitiffcat (Сообщение 205038)
А нахрен тебе это надо если это на ксорсе жрет больше ресурсов если же ты бы просто грузил готовый ландшафт из модельки и не парил себе мозг

Оно не жрет много памяти, если быть до конца честным оно использует памяти для хранения в два числа int, сколько там это байт я не в курсе, в процессе получения оно отжирает просто много памяти, но это от того, что я даже не быдлокодер, а кодерчмо :)

кстати если тебя заинтересовала картинка номер два, то подобное без извращений генерируется легко и в течении пары десятков миллисекунд

dsd 13.10.2011 22:45

Ответ: Странное.
 
Как лучше?
1)
for(int i=0;i<1000000;i++) {
double z=somedata[i];
anotherdata[i]=z*0.125*i;
}
2)
double z;
for(int i=0;i<1000000;i++) {
z=somedata[i];
anotherdata[i]=z*0.125*i;
}
3)
double *z;
for(int i=0;i<1000000;i++) {
z=somedata[i];
anotherdata[i]=z*0.125*i;
}
Или разницы нет?

.Squid 14.10.2011 01:05

Ответ: Странное.
 
Между первым и вторым в плане производительности разницы нет (если использовать нормальный компилятор), т.к. на стеке локальные переменные выделяются в области видимости функции. С точки зрения качества кода, то переменную лучше объявлять как можно ближе к тому месту, где она будет использоваться (ну, не превращая все в кашу, конечно).
Между первыми двумя и третим разница существенная (мне кажется, ты таки еще не разобрался в указателях).

ЗЫ. Вообще это все можно было бы загуглить. А еще лучше проверить самому. Например, глянуть ассемблерный листинг того, что компилятор наделал.

dsd 14.10.2011 01:27

Ответ: Странное.
 
Мне таки с каждым днем кажется, что я в с++ все меньше и меньше понимаю :)
С указателями я более-менее уловил уже что куда, вроде.
т.к. такая структура данных у меня обрабатывается нормально и выдает то, что и планировалось изначально.


PHP код:

Handle mesh;
//его поверхности ближнего плана
Handle **surf;
//среднего плана
Handle **surfm;
//дальнего плана
// разрешение наиболее детализировнных ячеек.
int resolution;
int number;

//data for deformations
//хранитель мирового зерна.
int uppersize;
double **seed;
//массивы билжнего плана.
double ****strip;
//шершавость нижнего уровня
double sharpness;
//сглживание
double smothing



Меня просто интересовал следующий момент:
Если у меня есть цикл с хреновой тучей итераций, то в каждой итерации объявлять переменные служащие для хранения промежуточных данных это то же самое, что объявить их до цикла или нет(в плане производительности).

pozitiffcat 14.10.2011 10:20

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 205789)
Мне таки с каждым днем кажется, что я в с++ все меньше и меньше понимаю :)
С указателями я более-менее уловил уже что куда, вроде.
т.к. такая структура данных у меня обрабатывается нормально и выдает то, что и планировалось изначально.


PHP код:

Handle mesh;
//его поверхности ближнего плана
Handle **surf;
//среднего плана
Handle **surfm;
//дальнего плана
// разрешение наиболее детализировнных ячеек.
int resolution;
int number;

//data for deformations
//хранитель мирового зерна.
int uppersize;
double **seed;
//массивы билжнего плана.
double ****strip;
//шершавость нижнего уровня
double sharpness;
//сглживание
double smothing



Меня просто интересовал следующий момент:
Если у меня есть цикл с хреновой тучей итераций, то в каждой итерации объявлять переменные служащие для хранения промежуточных данных это то же самое, что объявить их до цикла или нет(в плане производительности).

объявляй до цикла что бы юзать переменные вне его, в цикле для защиты от доступа вне области видимасти цикла, хотя на производительность не сказывается, проверял!

pozitiffcat 14.10.2011 10:28

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 205772)
Как лучше?
3)
double *z;
for(int i=0;i<1000000;i++) {
z=somedata[i];
anotherdata[i]=z*0.125*i;
}
Или разницы нет?

Это вообще не скомпилится! При юзанье указателей таким способом их надо разыменовывать
int _tmain(int argc, _TCHAR* argv[])
{
int somedata[100];
int anotherdata[100];
double* z=(double*)malloc(sizeof(double));//определить размер данных
for(int i=0;i<100;i++) {
*z=somedata[i];//юзать разыменовывая
anotherdata[i]=(*z)*0.125f*i;
}
return 0;
}
что бы исключить случайного приведения float к int юзается не так 0.125, а так 0.125f

dsd 14.10.2011 11:45

Ответ: Странное.
 
Таки да глупость смозорозил под 3.

Но разыменовывание уж очень какое-то ректальное тайнство из серии: "а я всеравно прав, #$%^@ #$%@^ компилятор!!!" :) чет я не могу вообразить себе ситуацию, когда это потребутся, у меня все-таки в конце цепочки указателей последний указывает на обычную переменную.

Цитата:

что бы исключить случайного приведения float к int юзается не так 0.125, а так 0.125f
gnu gcc вроде не пытается такого сделать я бы заметил :) У него с автоматическим переводом все хорошо, только обрато из int в float надо кой-чо приписывать в формулу для правильного взаимопонимания :)

pozitiffcat 14.10.2011 12:07

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 205806)
Таки да глупость смозорозил под 3.

Но разыменовывание уж очень какое-то ректальное тайнство из серии: "а я всеравно прав, #$%^@ #$%@^ компилятор!!!" :) чет я не могу вообразить себе ситуацию, когда это потребутся, у меня все-таки в конце цепочки указателей последний указывает на обычную переменную.


gnu gcc вроде не пытается такого сделать я бы заметил :) У него с автоматическим переводом все хорошо, только обрато из int в float надо кой-чо приписывать в формулу для правильного взаимопонимания :)

Указатели не используются в таких случаях как в 3 примере, это плохой и сложный стиль =) их нужно использовать для создания экземпляров класса
Код:

class mycl
{
public:
void foo();
};

void mycl::foo()
{
printf("foo");
}

........
mycl* m = new mycl();//определение класса в указатель (создание не в стеке а в куче)
//теперь можно юзать объект
cl->foo();
//или
(*cl).foo();//тут уж как тебе проще
/*
при передаче не указателя в функцию, объект копируется, это не есть
хорошо, объекты нужно передавать указателями, следовательно и
создавать их как указатели оператором new
это я так.. своими словами.. в умных книжках конечно по другому написано
так что для того чтобы лучше понять прочитай книгу, читается за 2 дня
300 страниц сам читал!*/


pozitiffcat 14.10.2011 12:09

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 205806)
Таки да глупость смозорозил под 3.
gnu gcc вроде не пытается такого сделать я бы заметил :) У него с автоматическим переводом все хорошо, только обрато из int в float надо кой-чо приписывать в формулу для правильного взаимопонимания :)

попробуй так float f = 20 / 3; что выдаст и f=20.0f/3.0f
Код:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
        float f = 20 / 3;//тут выдаст 6
        cout<<f<<endl;
        f=20.0f/3.0f;//а тут 6.6 и т.д.
        cout<<f<<endl;
        Sleep(5000);
        return 0;
}


.Squid 14.10.2011 12:12

Ответ: Странное.
 
Цитата:

Сообщение от pozitiffcat (Сообщение 205803)
что бы исключить случайного приведения float к int юзается не так 0.125, а так 0.125f

Что это за ерунда? 0.125 - это double. 0.125f - это float.

Цитата:

Сообщение от dsd (Сообщение 205806)
Но разыменовывание уж очень какое-то ректальное тайнство из серии: "а я всеравно прав, #$%^@ #$%@^ компилятор!!!" :) чет я не могу вообразить себе ситуацию, когда это потребутся, у меня все-таки в конце цепочки указателей последний указывает на обычную переменную.

Ты все таки не понял суть указателей. Как ты можешь использовать содержимое ячейки памяти, на которую указывает указатель, без разыменования? Без операции разыменования указатели были бы вещами в себе.

dsd 14.10.2011 12:56

Ответ: Странное.
 
Цитата:

class ground{
...
double ****strip;
...

ground(){
...
strip= new double ***[number+2];
for(int i=0;i<number+2;i++){strip[i]=new double **[number+2];}
for(int i=0;i<number+2;i++){for(int j=0;j<number+2;j++){
strip[i][j]=new double *[resolution+1];
for(int k=0;k<=resolution;k++){strip[i][j][k]=new double[resolution+1];}}}
for(int i=0;i<number+2;i++){for(int j=0;j<number+2;j++){NullizeStrip(i,j);Diamond_Squa re(i,j,sharpness, smothing);}}
for(int i=0;i<number;i++){for(int j=0;j<number;j++){mesh_deformer(i,j);Surface_Monol itizer(i,j);}}
...

}
...
void Diamond_Square(int a,int b, double sharp, int diff){
...
if(strip[a][b][i][j]==0 && val00!=0 && val01!=0 && val10!=0 && val11!=0){strip[a][b][i][j]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
if(strip[a][b][i-step][j]==0 && val00!=0 && val01!=0){strip[a][b][i-step][j]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);}
if(strip[a][b][i+step][j]==0 && val10!=0 && val11!=0){strip[a][b][i+step][j]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);}
if(strip[a][b][i][j-step]==0 && val00!=0 && val10!=0){strip[a][b][i][j-step]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);}
if(strip[a][b][i][j+step]==0 && val01!=0 && val11!=0){strip[a][b][i][j+step]=0.5*(val01+val11)+0.5*step*xRnd(-sharp,sharp);}
...
}
...
void mesh_deformer(int a,int b){
printf("\n index is %d",a);
printf(" index is %d",b);
int qvert=xCountVertices(surf[a][b]);
double xc=xVertexX(surf[a][b],0);
double yc=xVertexZ(surf[a][b],0);
for(int i=0;i<qvert;i++){
double xk=xVertexX(surf[a][b],i);
double yk=xVertexZ(surf[a][b],i);
double val=0;
if(xk-xc<resolution && yk-yc<resolution){

val=strip[a+1][b+1][xMod(xk,resolution)][xMod(yk,resolution)];}

else{
//также необходимо провести сшивку нормалей у соседних мешей
if(xk-xc==resolution && yk-yc<resolution){val=strip[a+1][b+1][resolution][xMod(yk,resolution)];}
if(yk-yc==resolution && xk-xc<resolution){val=strip[a+1][b+1][xMod(xk,resolution)][resolution];}
if(yk-yc==resolution && xk-xc==resolution){val=strip[a+1][b+1][resolution][resolution];}
}
xVertexCoords(surf[a][b],i,xk,val,yk);}}
...
};
Значит в цитируемых мной строчках происходит какая-то магия, а не то, что мне воображается. И в обычной вселенной компилятор должен посылать меня нах всвязи с отказом конвертировать double* в double. Но, блин, может я и косноязычен и в употребляемые мной термины вкладываю не общепринятые определения, но коль такой код работает и я представляю себе детально где что куда и как происходит, то отчасти я с указателями разобрался. Хватит, короче, мне самооценку понижать...

HolyDel 14.10.2011 13:20

Ответ: Странное.
 
Цитата:

double ****strip;
очень нехорошо, когда пишешь в команде. да и все эти многократные new не нужны. память-то фрагментируется. поставь ради эксперимента ету штуку на ночь поработать. если нужна настолько глубокая вложенность (а она нужна) лучше все это дело оборачивать в классы. в скорости не потеряешь, так как все тривиальные функции заинлайнятся, а понятнее будет. хотя пока ты один - то это не больно то и нужно.

xMod(yk,resolution) - зачем использовать хорсовские функции для вычисления модуля? yk % resolution же.

по поводу демки - работает. когда генерируется очередной кусок - есть небольшое подвисание. это на i7 с 8 гигабайтами оперативки. МоКа правильно говорит - хочешь писать низкоуровневые вещи - пиши их на низкоуровневом АПИ. тем ни менее - сам алгоритм работает. все нормально, без косяков.

pozitiffcat 14.10.2011 13:45

Ответ: Странное.
 
то что ты делаешь в коде вообще не понятно, отложи свою программу на пол годика и вернись к ней, ты что нибудь разберешь? Пиши код понятный, как будто ты пишешь его для когото!

double ****strip;
как юзать структуры, если ты это хочешь...
Код:

struct Vertex
float x;
float y;
float z
};

Vertex myVerts[100500];
int i=0;
while(100500>i++)
      myVerts[i].x = i;


dsd 14.10.2011 14:10

Ответ: Странное.
 
Holydel, у меня на всю программу один объект. Командой new я пользуюсь толь ко в конструкторе. А потом как карточный шулер тасую нижние уровни указателей. Если бы я пользовал нью каждый раз вместо перетасовки уровней оно бы каждую секунду по 15 мб памяти отжирало бы, в следствии чего и извращаюсь
:-)
Старую версию я бросил и пишу новую в ней подвисаний нет, но она сложней раз в десять структурно, но вроде быстрей и дает над данными много контроля без усилий. К зиме или лету допишу, наверно. Главное что оно кол-во элементов теперь меняет легко и непринужденно

это не блитцевский мод. Оно у меня контролирует индексы массивов, что бы они в чужую память не лезли и в минуса не уходили.

dsd 14.10.2011 14:17

Ответ: Странное.
 
Pozitiffcat, через полгода вспомню, даже через год. Но на данном этапе разработки поего 'продукта' смысла комментить особого нет ибо итоговый алгоритм от первоначального отличается порой радикально. Вот допишу если тогда комментов накидаю :-)

pozitiffcat 14.10.2011 14:25

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 205824)
Pozitiffcat, через полгода вспомню, даже через год. Но на данном этапе разработки поего 'продукта' смысла комментить особого нет ибо итоговый алгоритм от первоначального отличается порой радикально. Вот допишу если тогда комментов накидаю :-)

Ну не пишут так программы на c++. Самый максимум уровень указателя это char** массив строк... Читай книжку и придумай как сделать на классах
З.Ы. я делаю огромнейшие проекты на c++ для фирмы, у меня ниразу небыло необходимости что либо объявить так как делаешь ты

dsd 14.10.2011 20:19

Ответ: Странное.
 
Цитата:

Сообщение от pozitiffcat (Сообщение 205825)
Ну не пишут так программы на c++. Самый максимум уровень указателя это char** массив строк... Читай книжку и придумай как сделать на классах
З.Ы. я делаю огромнейшие проекты на c++ для фирмы, у меня ниразу небыло необходимости что либо объявить так как делаешь ты

В данной ситуации иная организация памяти была бы глупостью. Больше всего итоговая структура(и нихрена это слово к struct отношения не имеет) похожа на пазл. Первые две звезды контролируют текущую позицию кусочка пазла, а последние то, что на пазле нарисовано. И сделано это для того, чтобы единожды выделенная память использовалась снова и снова, вот.

pozitiffcat 14.10.2011 21:49

Ответ: Странное.
 
если ты объявишь класс, то единожды выделенная память будет использоваться снова и снова

Код:

struct Spicture
{
int pixels[320][240];
};

struct Spazl
{
float pos_x;
float pos_y;
Spicture pic;
};

class Cpazl
{
public:
Spazl all_pazl[100500];//ну или использовать лист
};


Cpazl* pazl = new Cpazl();
int cnt=100500;
while(cnt--)
{
pazl->all_paz(cnt).pos_x=41278;
pazl->all_paz(cnt).pos_y=12455;
for(int pix_x=0;pix_x<320;pix_x++)
for(int pix_y=0;pix_y<320;pix_y++)
pazl->all_paz(cnt).pic[pix_x][pix_y]=0xffffffff;
}

//как-то так, ну если использовать лист вместо 100500, и динамические int pixels, будет правильный ход

dsd 16.10.2011 15:27

Ответ: Странное.
 

Очередные 2+2=4 :)
Я таки сделал ландшафт частицами, в демке 400 частиц из поверхностей 32х32 клеток, в нормальной версии должно быть такого разрешения 36 частиц.

Оказывается для хрома есть нечто такое же как андроид маркет
https://chrome.google.com/webstore?h...rce=chrome-ntp

dsd 16.10.2011 17:14

Ответ: Странное.
 


Первые эксперименты с раскрашиванием вершин.

pozitiffcat 16.10.2011 17:16

Ответ: Странное.
 
выглядит клево

dsd 16.10.2011 17:24

Ответ: Странное.
 
Ага, может в итоге и текстуры будут не нужны, какой-нить нерегулярный шум в шейдере намутить, или травы натыкать еще одной системой частиц.

Mr_F_ 16.10.2011 17:27

Ответ: Странное.
 
смущают резкие прямые возвышенности похожие на разделения между квадратными кусками терейна.

dsd 16.10.2011 17:34

Ответ: Странное.
 
Главное, что в черне заработало, а дальше уже надо коэффициенты подбирать для шумогенераторов, чтобы совпадали. Счас нижний давит сильней чем верхний просто.

dsd 17.10.2011 00:59

Ответ: Странное.
 

Мне не хватает тумана, облачков и мозгов. Кто-нибудь ландшафты автоматически текстурил, а?

Mr_F_ 17.10.2011 03:48

Ответ: Странное.
 
Цитата:

Мне не хватает тумана, облачков и мозгов. Кто-нибудь ландшафты автоматически текстурил, а?
я думаю, они:
http://outerra.com/

dsd 17.10.2011 04:39

Ответ: Странное.
 
Почитал чутка их форум.


-Wow! Your engine looking so nice. I'm trying to create something same. But I can't solve some problems. How did you do that?
- We just use our amazing fractal algoritms. A bit math, a bit coding and so is on.
- Oukey...
-Fuck yeahh...

Как вот так у них на форуме дело обстоит :-)

moka 17.10.2011 15:58

Ответ: Странное.
 
И правильно. А то задают вопросы: "Как сделать игру". Как ещё ответить, если только не: "Ну нужно желание, немножко воспользоваться смекалкой, и да, не забыть про кодинг".
Правильно ответили..

dsd 17.10.2011 16:19

Ответ: Странное.
 
Да у них весь раздел про технологии это колонка тонкого английского юмора.

Причем спрашивают люди отмедитировавшие на эту тему пару месяцев, а в ответ им несут такую ересь, што пестец.

dsd 17.10.2011 22:44

шум перлина
 

прикола ради написал це
Код:

Handle perlin_noise(int seed, int size){
srand(seed);
int resolution=1<<size;
printf("\n resolution %d",resolution);
//создание структуры данных
double **m[size];
for(int i=0;i<size;i++){
int width=1<<(i+1);
m[i]=new double*[width];
for(int j=0;j<width;j++){m[i][j]=new double[width];}
printf("\n %d",width);
}
//заполнение структуры шумом
for(int i=0;i<size;i++){
    int width=1<<(i+1);
    for(int j=0;j<width;j++){for(int k=0;k<width;k++){m[i][j][k]=(1-2*(double)rand()/RAND_MAX)/(width>>1);}}}

//суммирование шума
for(int i=0;i<resolution;i++){for(int j=0;j<resolution;j++){
    double val=0;
        for(int k=0;k<size;k++){
        //нулевой массив шириной 2 ячейки
        int width=2<<k;
        double vi=width*i/resolution;// что оно мне считает? О_о
        double hi=width*j/resolution;// что оно мне считает? О_о
            //так индексы
        int x0=floor(vi);
        int x1=ceil(vi);
        double deltax=vi-x0;
        int y0=floor(hi);
        int y1=ceil(hi);
        double deltay=hi-y0;
        //теперь вычисление приближенного значения
        //косяк тута в формуле.
      val=val+((m[k][x0][y0]*deltax+m[k][x1%width][y0]*(1-deltax))*deltay+(m[k][x0][y1%width]*deltax+m[k][x1%width][y1%width]*(1-deltax))*(1-deltay));
        }
        m[size-1][i][j]=val; }}
//приведение в интервал (0,1)
double min=100000.01;
double max=-100000.01;
for(int i=0;i<resolution;i++){for(int j=0;j<resolution;j++){
if(m[size-1][i][j]>max){max=m[size-1][i][j];}
if(m[size-1][i][j]<min){min=m[size-1][i][j];}
}}
double length=max-min;
for(int i=0;i<resolution;i++){for(int j=0;j<resolution;j++){
m[size-1][i][j]=(m[size-1][i][j]-min)/length;
}}
//рисование текстуры
Handle tex=xCreateTexture(resolution,resolution);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (int i=0;i<resolution;i++){
    for (int j=0;j<resolution;j++){
        double val=pow(m[size-1][i][j],2);
        xWritePixelFast(i,j,ARGB(255,255*val,255*val,255*val),xTextureBuffer(tex));}}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));

return tex;

}

пошел курить алгоритмы сглаживания


:))


результат обоих кусков идентичен, а вот время различается сильно :)
PHP код:

val=val+((m[k][x0][y0]*deltax+m[k][x1%width][y0]*(1-deltax))*deltay+(m[k][x0][y1%width]*deltax+m[k][x1%width][y1%width]*(1-deltax))*(1-deltay)); 

Код:

        //можно посчитать четыре прямые через вершины и усреднить итоговую сумму.
      /*double val00=m[k][x0][y0];
        double val01=m[k][x1%width][y0];
        double val10=m[k][x0][y1%width];
        double val11=m[k][x1%width][y1%width];*/
        //вычисление точек на краях, точка может быть вне границы квадрата, но это пох.
        //прямая через две точки
        //  |x2-x1  y2-y1|
        //  |x -x1  y -y1|=0
        // уравнение прямой (x2-x1)(y-y1)-(x-x1)(y2-y1)=0
        //y=x(y2-y1)/(x2-x1)+y1-x1(y2-y1)/(x2-x1)
        //точка 0,0  и deltax,deltay ищу точку на этой прямой с координатой x=1
        double x=1;
        double x1=0;
        double y1=0;
        double x2=deltax;
        double y2=deltay;
        double y=x*(y2-y1)/(x2-x1)+y1-x1*(y2-y1)/(x2-x1);
        int ymin=floor(y);
        int ymax=ceil(y);
        double val00=(m[k][x00][ymin%width]*(ymax-ymin)+m[k][x00][ymax%width]*(1-ymax+ymin)-m[k][x00][y00])*deltax+m[k][x00][y00];
        //точка 0,1  и deltax,deltay ищу точку на этой прямой с координатой x=1
        x=1;
        x1=0;
        y1=1;
        y=x*(y2-y1)/(x2-x1)+y1-x1*(y2-y1)/(x2-x1);
        //индекс у значений x01 а игрек
        ymin=floor(y);
        ymax=ceil(y);
        double val01=(m[k][x10][ymin%width]*(ymax-ymin)+m[k][x10][ymax%width]*(1-ymax+ymin)-m[k][x00][y10])*deltax+m[k][x00][y10];

        //точка 1,0  и deltax,deltay ищу точку на этой прямой с координатой x=0
        x=0;
        x1=1;
        y1=0;
        y=x*(y2-y1)/(x2-x1)+y1-x1*(y2-y1)/(x2-x1);
        ymin=floor(y);
        ymax=ceil(y);
        double val10=(m[k][x00][ymin%width]*(ymax-ymin)+m[k][x00][ymax%width]*(1-ymax+ymin)-m[k][x10][y00])*(1-deltax)+m[k][x10][y00];

        //точка 1,1  и deltax,deltay ищу точку на этой прямой с координатой x=0
        x=0;
        x1=1;
        y1=1;
        y=x*(y2-y1)/(x2-x1)+y1-x1*(y2-y1)/(x2-x1);
        ymin=floor(y);
        ymax=ceil(y);
        double val11=(m[k][x10][ymin%width]*(ymax-ymin)+m[k][x10][ymax%width]*(1-ymax+ymin)-m[k][x10][y10])*(1-deltax)+m[k][x10][y10];

        //прямая через две точки
        //  |x2-x1  y2-y1|
        //  |x -x1  y -y1|=0
        // уравнение прямой (x2-x1)(y-y1)-(x-x1)(y2-y1)=0
        //y*(x2-x1)=x(y2-y1)+y1*(x2-x1)-x1(y2-y1)
        //x=y1*(x2-x1)/(y2-y1)-x1-y*(x2-x1)/(y2-y1)
        //точка 0,0  и deltax,deltay ищу точку на этой прямой с координатой y=1
        y=1;
        x1=0;
        y1=0;
        x2=deltax;
        y2=deltay;
        x=y1*(x2-x1)/(y2-y1)-x1-y*(x2-x1)/(y2-y1);
        ymin=floor(x);
        ymax=ceil(x);
        double val100=(m[k][ymin%width][y00]*(ymax-ymin)+m[k][ymax%width][y00]*(1-ymax+ymin)-m[k][x00][y00])*deltay+m[k][x00][y00];
        //точка 0,1  и deltax,deltay ищу точку на этой прямой с координатой y=1
        y=1;
        x1=0;
        y1=1;
        x=y1*(x2-x1)/(y2-y1)-x1-y*(x2-x1)/(y2-y1);
        //индекс у значений x01 а игрек
        ymin=floor(y);
        ymax=ceil(y);
        double val101=(m[k][ymin%width][y10]*(ymax-ymin)+m[k][ymax%width][y10]*(1-ymax+ymin)-m[k][x00][y10])*(1-deltay)+m[k][x00][y10];

        //точка 1,0  и deltax,deltay ищу точку на этой прямой с координатой x=0
        y=0;
        x1=1;
        y1=0;
        x=y1*(x2-x1)/(y2-y1)-x1-y*(x2-x1)/(y2-y1);
        ymin=floor(y);
        ymax=ceil(y);
        double val110=(m[k][ymin%width][y00]*(ymax-ymin)+m[k][ymax%width][y00]*(1-ymax+ymin)-m[k][x10][y00])*deltay+m[k][x10][y00];

        //точка 1,1  и deltax,deltay ищу точку на этой прямой с координатой x=0
        y=0;
        x1=1;
        y1=1;
        x=y1*(x2-x1)/(y2-y1)-x1-y*(x2-x1)/(y2-y1);
        ymin=floor(y);
        ymax=ceil(y);
        double val111=(m[k][ymin%width][y10]*(ymax-ymin)+m[k][ymax%width][y10]*(1-ymax+ymin)-m[k][x10][y10])*(1-deltay)+m[k][x10][y10];

        //сумма
        val=val+0.125*(val00+val01+val10+val11+val100+val101+val110+val111);


dsd 18.10.2011 14:29

Ответ: Странное.
 
Накурился. Походу то что мне хочется это нетривиальная задача, надо сочинять нечто типа растеризации только в четырехугольнике и по парабалам или корню от исходных данных. Кстати шум перлина должен замечательно получится шейдером ибо механизм вычисления координаты в текстурах шума разных октав и размероа я сочинил, а растеризация реализована вроде железом.

pozitiffcat 18.10.2011 15:04

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 206212)
Накурился. Походу то что мне хочется это нетривиальная задача, надо сочинять нечто типа растеризации только в четырехугольнике и по парабалам или корню от исходных данных. Кстати шум перлина должен замечательно получится шейдером ибо механизм вычисления координаты в текстурах шума разных октав и размероа я сочинил, а растеризация реализована вроде железом.

а это вообще зачем? ландшафт генерить?

dsd 18.10.2011 23:09

Ответ: Странное.
 
Цитата:

Сообщение от pozitiffcat (Сообщение 206215)
а это вообще зачем? ландшафт генерить?

В принципе для любой природной хрени нужен минимально обработанный шум, потому как с обычным rand() получается плохой результат. Даймонд сквэйр дает все-таки результат больше похожий на пожамканную газету, зато резкий :) причем мою его реализацию можно еще ускорить раз в ацать там где-то затесались лишние проходы :)

Нагавнокодил таки простейший шум перлина с простым растеризатором.
Говнокод это когда знаешь как сделать быстрей, но сделаешь так только за деньги?

!!текстура 2^size x 2^size не надо туда ставить больших значений!!
PHP код:

//***********************************
int ARGB (int a,int r,int bint g){
int color=(a<<24)+(r<<16)+(b<<8)+g;
return 
color;
}

//***********************************
Handle perlin_noise(int seedint size){
srand(seed);
int resolution=1<<size;
printf("\n resolution %d",resolution);
//создание структуры данных
double **m[size];
for(
int i=0;i<size;i++){
int width=1<<(i+1);
m[i]=new double*[width];
for(
int j=0;j<width;j++){m[i][j]=new double[width];}
printf("\n %d",width);
}
//заполнение структуры шумом
for(int i=0;i<size;i++){
    
int width=1<<(i+1);
    for(
int j=0;j<width;j++){for(int k=0;k<width;k++){
        
//double kof=(size-i);
        /*
        if(i==0){kof=4.01;}
        if(i==1){kof=2.51;}
        if(i==2){kof=1.51;}
        if(i==3){kof=2.01;}
        if(i==4){kof=1.41;}
        if(i==5){kof=0.51;}*/
        
m[i][j][k]=(1-2*(double)rand()/RAND_MAX);}}}
//теперь семь одинаковых массивов максимального размера
double **m1[size];
for(
int i=0;i<size;i++){
int width=resolution;
m1[i]=new double*[width];
for(
int j=0;j<width;j++){m1[i][j]=new double[width];}
}
//обнуление
for(int i=0;i<size;i++){
    for(
int j=0;j<resolution;j++){for(int k=0;k<resolution;k++){m1[i][j][k]=0;}}}
//*****************************************************
//надо прописать весь шум в блок растеризации
for(int i=0;i<size;i++){
    
int width=1<<(i+1);
    for(
int j=0;j<width;j++){for(int k=0;k<width;k++){

        
m1[i][j<<(size-i-1)][k<<(size-i-1)]=m[i][j][k];}}}
//*****************************************************
for(int k=0;k<size;k++){
int step=resolution>>1;
while(
step>0){
    for(
int i=step;i<resolution-step;i=i+2*step){
        for(
int j=step;j<resolution-step;j=j+2*step){

        
double val00=m1[k][i-step][j-step];
        
double val01=m1[k][i-step][j+step];
        
double val10=m1[k][i+step][j-step];
        
double val11=m1[k][i+step][j+step];

        if(
m1[k][i][j]==&& val00!=&& val01!=&& val10!=&& val11!=0){m1[k][i][j]=0.25*(val00+val01+val10+val11);}
        if(
m1[k][i-step][j]==&& val00!=&& val01!=0){m1[k][i-step][j]=0.5*(val00+val01);}
        if(
m1[k][i+step][j]==&& val10!=&& val11!=0){m1[k][i+step][j]=0.5*(val10+val11);}
        if(
m1[k][i][j-step]==&& val00!=&& val10!=0){m1[k][i][j-step]=0.5*(val00+val10);}
        if(
m1[k][i][j+step]==&& val01!=&& val11!=0){m1[k][i][j+step]=0.5*(val01+val11);}
        }
    }
step=step>>1;}
}
//*****************************************************
//создание массива для суммы значений
double **m0=new double*[resolution];
for(
int j=0;j<resolution;j++){m0[j]=new double[resolution];}

//суммирование
for(int i=0;i<resolution;i++){for(int j=0;j<resolution;j++){
double val=0;
for(
int k=0;k<size;k++){val=val+m1[k][i][j];}

m0[i][j]=val;
}}
//приведение в интервал (0,1)
double min=100000.01;
double max=-100000.01;
for(
int i=0;i<resolution;i++){for(int j=0;j<resolution;j++){
if(
m0[i][j]>max){max=m0[i][j];}
if(
m0[i][j]<min){min=m0[i][j];}
}}
double length=max-min;
for(
int i=0;i<resolution;i++){for(int j=0;j<resolution;j++){
m0[i][j]=(m0[i][j]-min)/length;
}}
//рисование текстуры
Handle tex=xCreateTexture(resolution,resolution);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (
int i=0;i<resolution;i++){
    for (
int j=0;j<resolution;j++){
        
double val=pow(m0[i][j],2);
        
xWritePixelFast(i,j,ARGB(255,255*val,255*val,255*val),xTextureBuffer(tex));/*
        int red=0;
        int green=0;
        int blue=0;
        if(val<=0.25) {blue=(1-val)*255; green=125*(1-val);red=0;} else {
            if(val>=0.6) {red=255*val; green=120*val;blue=0;}
            else{red=255*val; green=255*val;blue=0;}}
        xWritePixelFast(i,j,ARGB(255,red,green,blue),xTextureBuffer(tex));*/

        
}}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));

return 
tex;



А че принтф это оооочень тормазная ф-ция?

dsd 18.10.2011 23:58

Ответ: Странное.
 
слегка улучшенный алгоритм

dsd 19.10.2011 00:11

Сравнение двух алгоритмов
 

слева перлин справа даймонд размер текстур идентичный 512 х 512
на пробел новые текстуры.
Результат какого алгоритма красивше?

Зы. Почитал статьи как делать шум перлина на гамдеве. Я походу какой-то адовый кодило, ни мат обоснования, ни возведений в хрензнаеткакую степень с корнем. никахих функций напоминающих гаусинный блюр. Короче это не шум перлина, хоть и выглядит также :D

pozitiffcat 19.10.2011 12:07

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 206257)

А че принтф это оооочень тормазная ф-ция?

нет, но лучше в c++ использовать поток cout;
cout << "mystr" << intvar << floatvar << endl;

pozitiffcat 19.10.2011 12:08

Ответ: Сравнение двух алгоритмов
 
Цитата:

Сообщение от dsd (Сообщение 206266)
Результат какого алгоритма красивше?

Зы. Почитал статьи как делать шум перлина на гамдеве. Я походу какой-то адовый кодило, ни мат обоснования, ни возведений в хрензнаеткакую степень с корнем. никахих функций напоминающих гаусинный блюр. Короче это не шум перлина, хоть и выглядит также :D

слева круче.


Часовой пояс GMT +4, время: 22:30.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot