В программирование не разбираюсь, но всегда было интересно как делаются сталкерские бампы, я так понимаю это тот самый код который отвечает за их создание?
Код
*strstr(fname, "_bump") = 0;
R_ASSERT2(FS.exist(fn, "$game_textures$", fname, ".dds"), fname);
// Load SYS-MEM-surface, bound to device restrictions
D3DXIMAGE_INFO IMG;
S = FS.r_open(fn);
img_size = S->length();
ID3DTexture2D* T_base;
R_CHK2(D3DXCreateTextureFromFileInMemoryEx(HW.pDevice, S->pointer(), S->length(), D3DX_DEFAULT, D3DX_DEFAULT,
D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, D3DX_DEFAULT, D3DX_DEFAULT, 0, &IMG, nullptr, &T_base), fn);
FS.r_close(S);
// Create HW-surface
ID3DTexture2D* T_normal_1 = nullptr;
R_CHK(D3DXCreateTexture(
HW.pDevice, IMG.Width, IMG.Height, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &T_normal_1));
R_CHK(D3DXComputeNormalMap(
T_normal_1, T_base, nullptr, D3DX_NORMALMAP_COMPUTE_OCCLUSION, D3DX_CHANNEL_LUMINANCE, _BUMPHEIGH));
// Transfer gloss-map
TW_Iterate_1OP(T_normal_1, T_base, it_gloss_rev_base);
// Compress
fmt = D3DFMT_DXT5;
img_loaded_lod = get_texture_load_lod(fn);
ID3DTexture2D* T_normal_1C = TW_LoadTextureFromTexture(T_normal_1, fmt, img_loaded_lod, dwWidth, dwHeight);
mip_cnt = T_normal_1C->GetLevelCount();
#if RENDER == R_R2
// Decompress (back)
fmt = D3DFMT_A8R8G8B8;
ID3DTexture2D* T_normal_1U = TW_LoadTextureFromTexture(T_normal_1C, fmt, 0, dwWidth, dwHeight);
// Calculate difference
ID3DTexture2D* T_normal_1D = 0;
R_CHK(D3DXCreateTexture(HW.pDevice, dwWidth, dwHeight, T_normal_1U->GetLevelCount(), 0, D3DFMT_A8R8G8B8,
D3DPOOL_SYSTEMMEM, &T_normal_1D));
TW_Iterate_2OP(T_normal_1D, T_normal_1, T_normal_1U, it_difference);
// Reverse channels back + transfer heightmap
TW_Iterate_1OP(T_normal_1D, T_base, it_height_rev_base);
// Compress
fmt = D3DFMT_DXT5;
ID3DTexture2D* T_normal_2C = TW_LoadTextureFromTexture(T_normal_1D, fmt, 0, dwWidth, dwHeight);
_RELEASE(T_normal_1U);
_RELEASE(T_normal_1D);
//
string256 fnameB;
strconcat(sizeof(fnameB), fnameB, "$user$", fname, "_bumpX");
ref_texture t_temp = Resources->_CreateTexture(fnameB);
t_temp->surface_set(T_normal_2C);
_RELEASE(T_normal_2C); // texture should keep reference to it by itself
#endif
// T_normal_1C - normal.gloss, reversed
// T_normal_2C - 2*error.height, non-reversed
_RELEASE(T_base);
_RELEASE(T_normal_1);
ret_msize = calc_texture_size(img_loaded_lod, mip_cnt, img_size);
return T_normal_1C;
}
}