Community
3ds Max Programming
Welcome to Autodesk’s 3ds Max Forums. Share your knowledge, ask questions, and explore popular 3ds Max SDK, Maxscript and Python topics.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Generate a bitmap texture from script

1 REPLY 1
Reply
Message 1 of 2
Anonymous
1014 Views, 1 Reply

Generate a bitmap texture from script

I am writing a Python script that, among other things, generates bitmaps derived from some data. It then sets them as distribution maps on ForestPack. See the example code below.

The bitmap is successfully created and Display()ed properly (See attachment Bitmap_Display.png)

However, when I create a BitmapTex and use SetBitmap to set the previously created bitmap, the texture appears blank (black), both in the material editor and when applying it (as a distribution map for ForestPack), see attachment BitmapTex_Material_Library.png.

Any clues? The only remotely related post I found was this one, and it says that SetBitmap is "no use".

The only relevant documentation example just creates a bitmap, but it does nothing with BitmapTex. However, ForestPack expects a Texmap or subclass as input for its density map.

 

Edit: is it at all expected that setting a bitmap from memory works? Is it required to reside in a file? It is not an absolute requirement for me to use a bitmap in memory, but it is preferable.

 

BMM_GRAY_8 = 3 # 8-bit grayscale bitmap.
BMM_FLOAT_GRAY_32 = 18 # 32-bit floating-point (non-compressed), monochrome/grayscale
BMM_OPEN_W = 2

width = 256
height = 256

data = [[random.random() for i in range(width)] for j in range(height)]
bm_name = "python_noise"

storage = MaxPlus.Factory.CreateStorage(BMM_GRAY_8)
info = storage.GetBitmapInfo()
info.SetWidth(width)
info.SetHeight(height)
info.SetName(bm_name)
info.SetGamma(2.2)
info.SetBitmapType(BMM_GRAY_8)

storage.Allocate(info, BMM_OPEN_W)

# now set the data on the bitmap storage
for x in range(width):
	for y in range(height):
		storage.Put16GrayFloat(x, y, data[x][y])

bm = MaxPlus.Factory.CreateBitmap(info)
bm.SetStorage(storage)
bm.Display(bm_name) # this works

bt = MaxPlus.Factory.CreateDefaultBitmapTex()
bt.SetMapName(bm_name, True) # wtf, isUIAction has to be true for Display to work...
bt.SetBitmap(bm)

# add it to material library
MaxPlus.MaterialLibrary.GetCurrentLibrary().Add(bt)

# now the bitmap texture is blank

 

1 REPLY 1
Message 2 of 2
drew.avis
in reply to: Anonymous

Hi there, when I tried this in MAXScript, I notice that you get an error when trying to create a BitmapTexture based on an in-memory bitmap (to the effect that the bitmap needs to be saved first).  So I tried updating your script based on this idea, and it works for me.  Here's the updated script with the changed/added lines highlighted:

import random

BMM_GRAY_8 = 3 # 8-bit grayscale bitmap.
BMM_FLOAT_GRAY_32 = 18 # 32-bit floating-point (non-compressed), monochrome/grayscale
BMM_OPEN_W = 2

width = 256
height = 256

data = [[random.random() for i in range(width)] for j in range(height)]
# bm_name = "python_noise"
bm_name = MaxPlus.PathManager.GetImageDir() + r'\python_noise.bmp' # must give the full path

storage = MaxPlus.Factory.CreateStorage(BMM_GRAY_8)
info = storage.GetBitmapInfo()
info.SetWidth(width)
info.SetHeight(height)
# set name w/ path
info.SetName(bm_name)
info.SetGamma(2.2)
info.SetBitmapType(BMM_GRAY_8)
info.SetCustomFlag(0)

storage.Allocate(info, BMM_OPEN_W)

# now set the data on the bitmap storage
for x in range(width):
	for y in range(height):
		storage.Put16GrayFloat(x, y, data[x][y])

bm = MaxPlus.Factory.CreateBitmap(info)
bm.SetStorage(storage)
bm.Display(bm_name) # this works

# save as a file <- this is new
bm.OpenOutput(info)
bm.Write(info)
bm.Close(info)

bt = MaxPlus.Factory.CreateDefaultBitmapTex()
bt.SetMapName(bm_name, True) # wtf, isUIAction has to be true for Display to work...
bt.SetBitmap(bm)
bt.ReloadBitmapAndUpdate() # <- I also needed this to update the BitmapInfo w/ file information it requires

# add it to material library
MaxPlus.MaterialLibrary.GetCurrentLibrary().Add(bt)

# should be usable


Drew Avis
Content Experience Designer

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report