Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 09.09.2011, 10:56   #31
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Странное.

А оно невсегда упадёт, пока чужую память не попортишь.
__________________
(Offline)
 
Ответить с цитированием
Старый 09.09.2011, 12:40   #32
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Сообщение от SBJoker Посмотреть сообщение
А оно невсегда упадёт, пока чужую память не попортишь.
это значит, что подобный указатель вернет мне адрес не той памяти, что была выделена под массив указатель на который я храню в ячейке исходного одномерного массива? Или что следить надо за тем, чтобы индексы были в пределах выделенной памяти?
(Offline)
 
Ответить с цитированием
Старый 09.09.2011, 12:49   #33
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Странное.

падать вроде и не должно. всем элементам массива указателей назначается адрес начала массива с даблами. соотв первый [2047] возьмёт указатель, второй сам дабл. правда смысла в массиве указателй на один и тот же адрес я не вижу.

при наличии этой строки падает
double gh[512][512];
делай так
double* gh = new double[512*512];
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
.Squid (09.09.2011), dsd (09.09.2011), SBJoker (09.09.2011)
Старый 09.09.2011, 12:59   #34
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

А, понял на что мне гуру намекают Что у меня во всех ячейках один и тот же массив и это попахивает кретинизмом хранить в одном массиве пару тысяч ссылок на один и тот же массив. Видимо для каждой ячейки нужно создавать уникальный массив и тогда все будет ок.
(Offline)
 
Ответить с цитированием
Старый 09.09.2011, 13:17   #35
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Странное.

Да. Почитай про указатели еще раз.
ЗЫ. Ссылка != указатель, кстати.
__________________

(Offline)
 
Ответить с цитированием
Старый 10.09.2011, 20:49   #36
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Продолжу нуб шоу по массивам:
double* gh = new double[512*512];
for(int i=0;i<512;i++) {
gh[0*i]=0.5*i;
}
for(int i=0;i<512;i++) {
printf(" value= %f",gh[0*i]);
}
печатает одно значение для всей строки, последнее. Я ожидал подряд идущих значений от 0 до 255,5.
упд. В нуле штолеО_о, это таки одномерный массив.

Идиотская конструкция печатает мне то что я хочу, где косяк в первой? ибо вторую печатать гораздо дольше:
//создаю массив
double *m0[size];
for(int i=0;i<size;i++){
m0[i]= new double[size];
}
//заполняю первую строку
for(int i=0;i<size;i++){
m0[0][i]=i;
}
//печатаю первую строку.
for(int i=0;i<size;i++){
printf(" index %f",m0[0][i]);
}
(Offline)
 
Ответить с цитированием
Старый 10.09.2011, 21:58   #37
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Странное.

0*i при любом значении i даёт 0, другими словами ты записываешь и печатаешь всегда значение одной единственной ячейки.
__________________
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
dsd (10.09.2011), moka (11.09.2011)
Старый 10.09.2011, 22:19   #38
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Я понял уже смысл такой записи массива

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

Причем он получился раз в 50 резче блитцевского при равном объеме вычислений. Генерирует текстуру 4096х4096 за 5 сек вместе с рисованием её против нескольких минут. Не зря я все-таки полировал себе мозг цпэпом.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Colossus (14.09.2011)
Старый 10.09.2011, 22:50   #39
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Странное.

Сообщение от dsd Посмотреть сообщение
глючный квадроалмазный генератор
Простите, ЧТО?!
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (11.09.2011)
Старый 10.09.2011, 23:02   #40
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

генератор карт высот по алгоритму diamond square

починил глюк, это был мусор в памяти
void xSeedRnd(int seed){
    
srand(seed);
}

double xRnd(double mindouble max){
    
double length=max-min;
    
double var =((double) rand() / (double)RAND_MAX);
    
double value=min+var*length;
return 
value;
}

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

Handle Map_Generator(int sizedouble sharp){
xSeedRnd(xMillisecs());
//создается массив для значений

double *m0[size+1];
for(
int i=0;i<=size;i++){
    
m0[i]= new double[size];
}
for(
int i=0;i<=size;i++){
    for(
int j=0;j<=size;j++){
        
m0[i][j]=0;
        }
    }
//заполнение краев случайными числами (1;5)
m0[0][0]=xRnd(-5,5);
m0[size][0]=xRnd(-5,5);
m0[0][size]=xRnd(-5,5);
m0[size][size]=xRnd(-5,5);
//определяю степень size
int m=size;
int repetitions=0;
while(
m!=1){
repetitions++;
m=size>>repetitions;
}
repetitions--;

int step=size>>1;
while(
step>0){
    
//первая строка
    
for(int i=step;i<=size-step;i=i+step){
        for(
int j=step;j<=size-step;j=j+step){
         
//углы текущей ячейки
        
double val00=m0[i-step][j-step];
        
double val01=m0[i-step][j+step];
        
double val10=m0[i+step][j-step];
        
double val11=m0[i+step][j+step];
         
//крест генерируемых значений
        
if(m0[i][j]==&& val00!=&& val01!=&& val10!=&& val11!=0){m0[i][j]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(
m0[i-step][j]==&& val00!=&& val01!=0){m0[i-step][j]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);}
        if(
m0[i+step][j]==&& val10!=&& val11!=0){m0[i+step][j]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);}
        if(
m0[i][j-step]==&& val00!=&& val10!=0){m0[i][j-step]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);}
        if(
m0[i][j+step]==&& val01!=&& val11!=0){m0[i][j+step]=0.5*(val01+val11)+0.5*step*xRnd(-sharp,sharp);}
        }
    }
step=step>>1;
}
//приведение значений в массиве в интервал (0;1)
double max=0;
double min=0;
for (
int i=0;i<=size;i++){
    for (
int j=0;j<=size;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<=size;i++){
    for (
int j=0;j<=size;j++){
        
m0[i][j]=(m0 [i][j]-min)/length;
    }
}
//*************************************
//дальше вывод значений
Handle tex=xCreateTexture(size,size);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (
int i=0;i<size;i++){
    for (
int j=0;j<size;j++){
        
int color=255*m0 [i][j];
        
xWritePixelFast(i,j,ARGB(255,color,color,color),xTextureBuffer(tex));
    }
}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));

return 
tex;

на пробел сгенерировать новую карту.

Последний раз редактировалось dsd, 23.10.2011 в 22:18.
(Offline)
 
Ответить с цитированием
Старый 11.09.2011, 01:23   #41
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Странное.

Как вариант, можно еще писать array[i + n*j], где n - число столбцов. Просто в действительности данные расположены линейно, никаких двумерных (и тем более трех- и n-мерных) структур данных в памяти не может быть.
ЗЫ. Не писал бы этого, если бы не увидел [0*i] о_О
__________________

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
dsd (11.09.2011), moka (11.09.2011)
Старый 11.09.2011, 14:41   #42
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.



Выкинул лишние проходы и научил это раскрашивать текстуру Теперь оно еще в 4 раза быстрей

void xSeedRnd(int seed){
srand(seed);
}

double xRnd(double min, double max){
double length=max-min;
double var =((double) rand() / (double)RAND_MAX);
double value=min+var*length;
return value;
}

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


Handle Map_Generator(int size, double sharp, int diff){

xSeedRnd(xMillisecs());
//создается массив для значений

double *m0[size+1];
for(int i=0;i<=size;i++){
m0[i]= new double[size];
}
for(int i=0;i<=size;i++){
for(int j=0;j<=size;j++){
m0[i][j]=0;
}
}
//заполнение краев случайными числами (1;5)
m0[0][0]=xRnd(-5,5);
m0[size][0]=xRnd(-5,5);
m0[0][size]=xRnd(-5,5);
m0[size][size]=xRnd(-5,5);

int step=size>>1;
while(step>0){
//первая строка
for(int i=step;i<=size-step;i=i+2*step){
for(int j=step;j<=size-step;j=j+2*step){

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

if(m0[i][j]==0 && val00!=0 && val01!=0 && val10!=0 && val11!=0){m0[i][j]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
if(m0[i-step][j]==0 && val00!=0 && val01!=0){m0[i-step][j]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);}
if(m0[i+step][j]==0 && val10!=0 && val11!=0){m0[i+step][j]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);}
if(m0[i][j-step]==0 && val00!=0 && val10!=0){m0[i][j-step]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);}
if(m0[i][j+step]==0 && val01!=0 && val11!=0){m0[i][j+step]=0.5*(val01+val11)+0.5*step*xRnd(-sharp,sharp);}
}
}
step=step>>1;
}
//приведение значений в массиве в интервал (0;1)
double max=0;
double min=0;
for (int i=0;i<=size;i++){
for (int j=0;j<=size;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<=size;i++){
for (int j=0;j<=size;j++){
m0[i][j]=pow(((m0 [i][j]-min)/length),diff);
}
}
//*************************************
//дальше вывод значений
Handle tex=xCreateTexture(size,size);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (int i=0;i<size;i++){
for (int j=0;j<size;j++){
double val=pow(m0 [i][j],2);
//уровень воды пусть будет 0,25. ТО есть чем ниже тем более синий цвет.
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),xText ureBuffer(tex));
}
}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));

return tex;
}

Последний раз редактировалось dsd, 23.10.2011 в 22:18.
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
moka (11.09.2011), Mr_F_ (11.09.2011), Nex (11.09.2011), St_AnGer (11.09.2011)
Старый 11.09.2011, 17:11   #43
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Странное.

А шейдером можешь генерить подобное?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Colossus (14.09.2011)
Старый 11.09.2011, 19:19   #44
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Нет.
(Offline)
 
Ответить с цитированием
Старый 14.09.2011, 20:03   #45
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

У меня появилась идея скрестить спаренный генератор высот и мою недосистему частиц в ландшафт напоминающий таковой из майнкрафта, только другим макаром.

Для начала генерируется карта 4к х 4к, потом на основе девяти ячеек из карты генерится другая 128х128, с актуальным размером 112х112 и 16 кратным нахлестом с соседними тайлами, для избежания резких швов.
Вокруг игрока летает девять детализированных систем частиц и еще одна с шагом основной карты для изображения отдаленного пейзажа.

в одной системе частиц у меня получается уместить 20к квадов, 112х112=12544 верхушек кубиков и остается ~10к квадов для имитации стен вырытых канавок. Вроде достаточно. Всего уже получится 20х10=200 к полигонов на ландшафт. Потом для этого дела генерится мой любимый двумерный массив указателей в ячейках которого будут объекты несущие в своих полях маски для раскраски территории.

Ваши ставки, господа. Смогу ли я подобное сочинить? По ощущениям это должно быть впритык, но по силам
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com